我使用f2py编译数字模块供Python脚本使用。我已将代码缩减为以下最小示例:
fd.f:
module fd
! Double precision real kind
integer, parameter :: dp = selected_real_kind(15)
contains
subroutine lprsmf(th)
implicit none
real(dp) th
write(*,*) 'th - fd',th
end subroutine lprsmf
end module fd
itimes.f:
subroutine itimes(th)
use fd
implicit none
real(dp) th
write(*,*) 'th - it',th
call lprsmf(th)
end subroutine itimes
reprun.py:
import it
th = 200
it.itimes(th)
用于编译和运行的命令如下(注意我在Windows下使用cmd
):
gfortran -c fd.f
f2py.py -c -m it --compiler=mingw32 fd.o itimes.f
reprun.py
输出结果为:
th - it 1.50520876326836550E-163
th - fd 1.50520876326836550E-163
我的第一个猜测是,th
无法以某种方式从reprun.py
正确传递到子例程itimes
。但是,我不明白这种行为,因为代码的完整版本包含其他输入,所有输入都正确传递。从Fortran调用itimes时我无法做同样的事情,所以我假设它与Python / Fortran接口有关。任何人都可以提供有关此行为发生原因的任何见解吗?
编辑:使用th = 200
替换reprun.py中的th = 200.0
会产生以下输出:
th - it 1.19472349365371216E-298
th - fd 1.19472349365371216E-298
答案 0 :(得分:1)
将itimes子程序包装在模块中。这是我做的:
itimes.f90:
module itime
contains
subroutine itimes(th)
use fd
implicit none
real(dp) th
write(*,*) 'th - it',th
call lprsmf(th)
end subroutine itimes
end module
编译&运行:
gfortran -c fd.f90
c:\python27_w32\python.exe c:\python27_w32\scripts\f2py.py -c -m it --compiler=mingw32 fd.f90 itimes.f90
运行reprun.py:
import it
th = 200
it.itime.itimes(th)
输出:
th - it 200.00000000000000
th - fd 200.00000000000000