【发布时间】:2022-06-14 18:08:22
【问题描述】:
我正在尝试使用f2py 编译一段旧的 Fortran 代码,以便可以在 Python 中调用它。
但是,有一部分涉及外部功能不起作用。
这是一个最小的工作示例,首先是test.f:
function f(x)
implicit double precision (a-z)
f = x * x
return
end function f
subroutine gauss(fun)
implicit double precision (a-h, j-z)
! external fun
x = 1.5
write(*,*) fun(x)
return
end subroutine gauss
并用makefile编译后
f2py -c --quiet --fcompiler=gnu95 \
--f90flags=“-Wtabs” \
-m test \
test.f
我使用 Python 调用它
import test
f = lambda x: x
test.gauss(test.f)
并得到错误TypeError: test.gauss() 1st argument (fun) can’t be converted to double。
在 第二次 尝试中,我取消注释子例程 gauss 中的行 external fun 并在编译期间收到以下错误消息
/tmp/tmpet9sk3e9/src.linux-x86_64-3.7/testmodule.c: In function ‘cb_fun_in_gauss__user__routines’:
/tmp/tmpet9sk3e9/src.linux-x86_64-3.7/testmodule.c:313:8: error: variable or field ‘return_value’ declared void
我现在没有想法,任何帮助将不胜感激!
【问题讨论】:
-
取消注释行
external fun并添加另一行double precision fun对我有用,所以 f2py 可能需要函数参数的显式类型声明(虽然不太确定......)numpy.org/devdocs/f2py/python-usage.html#call-back-arguments跨度>