我试图用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.?
答案 0 :(得分:0)
好的,我终于明白了。如上所述,必须声明o
,然后o
也必须放入函数fun
。然后必须使用Fortran的call
语句(而不是o = fun(n,x)
)调用该函数。显然,人们也可以摆脱大多数cf2py
陈述。有趣的是,fun
不必显式声明为具有数组返回的函数。以下代码适用于我:
Subroutine myscript(x,fun,o,n)
external fun
integer n
real*8 x(n)
real*8 o(n)
cf2py intent(in,copy), depend(n) :: x
cf2py intent(hide) :: n
cf2py intent(out), depend(n) :: o
call fun(n,x,o)
write(*,*) o
end
返回
[1. 2. 3.]
1.00000000 2.00000000 3.00000000