f2py 允许将 Fortran子例程转换为 python函数。因此,当它尝试将 Fortran 函数转换为 python 可调用对象时,它会引发错误并崩溃。如果要从 python 调用这些函数,则必须将它们重写为子例程。但是,由于它们只需要从一个 Fortran 子例程中调用,因此没有必要这样做。
解决方案是在子例程中包含函数,使用contains
. 下面是一个工作示例,使用与上面相同的结构:
下属
subroutine hello(a,b)
real(8), intent(in) :: a
real(8), intent(out) :: b
call newton(a, b)
end subroutine hello
subroutine newton (d,e)
real(8), intent(in) :: d
real(8), intent(out) :: e
e=q(d)
contains
real(8) function q(x)
real(8) :: x
q = h(x) + h(x-1)
end function
real(8) function h(x)
real(8) :: x
h = x*x-3*x+2
end function h
end subroutine newton
可以使用 f2py 将此文件转换为可调用的 python,特别是使用从命令行运行的f2py 文档f2py -c subs.f -m fsubs
中解释的“快速方式”生成可调用的共享对象,可以使用import fsubs
. 这个模块有一些帮助:
help(fsubs)
# Output
Help on module fsubs:
NAME
fsubs
DESCRIPTION
This module 'fsubs' is auto-generated with f2py (version:2).
Functions:
b = hello(a)
e = newton(d)
...
可以看出,该fsubs
模块包含 2 个函数hello
和newton
2 个子例程。现在,我们可以hello
从 python中调用fsubs.hello(4)
,正如预期的那样,产生 8。