如何使用F2Py从Fortran中的Python回调中返回一个值

时间:2013-11-28 12:03:40

标签: callback fortran intel-fortran f2py

考虑以下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打印输出到控制台后崩溃了。

任何想法可能会发生在这里?崩溃的原因将是一个奖励,但我真的只是想在此时获得一个简单的回调。

1 个答案:

答案 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回调示例中。