如何在F2PY中从回调函数返回数组?

时间:2015-08-10 15:23:57

标签: python fortran f2py

我试图用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.?

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