【发布时间】:2015-08-10 15:23:56
【问题描述】:
我正在尝试使用 F2PY 编写一个从 Python 到 Fortran 的小接口,其中一个数组被传递给 Python 中的回调函数,结果数组被传递回 Fortran。 我有以下 Fortran 代码:
Subroutine myscript(x,fun,o,n)
external fun
integer n
real*8 x(n)
cf2py intent(in,copy) x
cf2py intent(out) o
cf2py integer intent(hide),depend(x) :: n=shape(x,0)
cf2py function fun(n,x) result o
cf2py integer intent(in,hide) :: n
cf2py intent(in), Dimension(n), depend(n) :: x
cf2py end function fun
o = fun(n,x)
write(*,*) o
end
其中 fun 是 Python 中的回调函数,如下所示:
def f(x):
print(x)
return x
现在,当我使用 F2PY 包装 Fortran 代码并从 Python 运行它时,例如像这样:
myscript.myscript(numpy.array([1,2,3]),f)
我得到以下结果:
[1. 2. 3.]
1.00000000
显然,数组被传递给回调函数 f,但是当它被传回时,只有第一个条目被保留。 我需要做什么才能让整个阵列恢复原状?即在 Fortran 代码中获取变量 o 以包含数组 [1.,2.,3.] 而不是 1.?
【问题讨论】:
-
o在 Fortran 代码中未声明为数组,fun也未声明为数组结果。 -
玩了一段时间后,我不确定 f2py 是否支持这些功能。当我添加一个接口块时,在编译 C 包装器时它没有编译并出现一些神秘的错误。
-
顺便说一句,您声明了
cf2py intent(in), Dimension(n), depend(n) :: x,但在子程序中x是real*8 x(n),这是另一个问题。