Function 调用fortran函数的f2py子例程

Function 调用fortran函数的f2py子例程,function,subroutine,f2py,Function,Subroutine,F2py,是否可以编写一个Fortran f2py子例程来调用正在调用另一个Fortran函数的Fortran函数? 例如: subroutine hello(a) ... call newton(b, c) ... end subroutine hello subroutine newton (d,e) ... e=q(d) ... end subroutine newton real function q(x) ... q = h(

是否可以编写一个Fortran f2py子例程来调用正在调用另一个Fortran函数的Fortran函数? 例如:

subroutine hello(a)
    ...
    call  newton(b, c)
    ...
end subroutine hello

subroutine newton (d,e)
    ...
    e=q(d)
    ...
end subroutine newton

real function q(x)
    ...
    q = h(x) + h(x-1)
    ...
end function

real function h(x)
    ...
end function h

抱歉弄得一团糟。我试过了,但编译时出现错误……我需要从Python调用的唯一子模块是第一个子模块,这要提前感谢。

f2py允许将Fortran子例程转换为Python函数。因此,当它试图将Fortran函数转换为python可调用对象时,会引发错误并崩溃。如果要从python调用这些函数,则必须将它们重写为子例程。但是,由于它们只需要从一个Fortran子例程调用,因此不需要这样做

解决方案是使用
contains
将函数包含在子例程中。下面是一个工作示例,使用与上面相同的结构:

潜艇f 可以使用f2py将此文件转换为可调用的python,特别是使用运行命令行中的
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
模块包含两个函数,
hello
newton
,这两个子例程。现在,我们可以使用
fsubs从python调用
hello

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)
...