是否可以编写一个调用Fortran函数的Fortran f2py子例程来调用另一个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调用的唯一子是第一个子,请提前感谢。
答案 0 :(得分:0)
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 callable,特别是使用" quick方式"在命令行的f2py docs运行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
两个函数。现在,我们可以使用hello
从python中调用fsubs.hello(4)
,如预期的那样,产生8。