考虑以下Fortran子例程,在test.f中定义:
subroutine test(py_func)
use iso_fortran_env, only stdout => output_unit
external py_func
integer :: a
integer :: b
a = 12
write(stdout, *) a
b = py_func(a)
write(stdout, *) b
end subroutine
以下Python代码,在call_test.py中定义:
import test
def func(x):
return x * 2
test.test(func)
使用以下(英特尔编译器)编译:
python f2py.py -c test.f --fcompiler=intelvem -m test
我在运行test时希望这是输出:
12
24
但我实际上得到了这个:
12
0
似乎b
正在使用默认值而不是test
的结果进行初始化。我尝试在Fortran中使用以下内容:
!f2py intent(callback) py_func
external py_func
!f2py integer y,x
!f2py y = py_func(x)
但是我的程序在12
打印输出到控制台后崩溃了。
任何想法可能会发生在这里?崩溃的原因将是一个奖励,但我真的只是想在此时获得一个简单的回调。
答案 0 :(得分:0)
我没有声称理解它,我在F2Py forum thread找到答案。添加integer py_func
(不前缀为!f2py
)对我来说非常有用:
subroutine test(py_func)
use iso_fortran_env, only stdout => output_unit
!f2py intent(callback) py_func
external py_func
integer py_func
!f2py integer y,x
!f2py y = py_func(x)
integer :: a
integer :: b
a = 12
write(stdout, *) a
b = py_func(a)
write(stdout, *) b
end subroutine
也许这与在分配给b之前用于存储结果的临时值所需的空间有关?在任何情况下,它显然都依赖于编译器,这解释了为什么它不在你可以在网上找到的各种F2Py回调示例中。