![](/img/trans.png)
[英]External function ‘f’ at (1) has no IMPLICIT type in subroutine with f2py
[英]How make external function work with f2py?
我正在尝试用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 从 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
我现在没有想法,任何帮助将不胜感激!
我已经(部分)想通了: f2py
需要你明确指定函数的使用。 方法如下:
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)
!! <-------- updates starts HERE
external fun
!f2py real*8 y
!f2py y = fun(y)
double precision fun
!! <-------- updates ends HERE
x = 1.5
write(*,*) fun(x)
return
end subroutine gauss
然后使用编译它
main:
f2py -c --quiet --fcompiler=gnu95 \
--f90flags=“-Wtabs” \
-m test \
test.f
你可以用
import test
f = lambda x: x
test.gauss(test.f)
test.gauss(f)
并看到外部函数适用于 Fortran 和 Python 函数。
两个旁注:
!f2py intent(callback) fun
是必要的,但我发现代码可以在没有它的情况下工作。y
(尽管这可能不是一个好习惯)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.