我可以在子程序调用的子程序中使用F2PY吗?

时间:2015-08-11 18:51:48

标签: python nested fortran subroutine f2py

使用F2PY作为包装器,是否可以将子程序与子程序调用一起使用?如果是这样,怎么样?

如果我不清楚,我的意思是这样的:

    SUBROUTINE average(a, b, out)

    real a, b, out
cf2py intent(in) a, b
cf2py intent(out) out

    call add(a, b, out)

    out=out/2

    END

add子例程如下:

  subroutine add(a, b, out)

  real a, b, out

  out = a + b

  return
  end

尝试f2py -c -m平均average.f并导入到python我得到:

ImportError:./ sqrage.so:undefined symbol:add _

此外,向第二个子例程添加意图并不能解决问题。

2 个答案:

答案 0 :(得分:5)

您需要在编译命令中包含包含add的文件,例如

f2py -c -m average average.f add.f

您导入的共享库需要在导入时解析其引用,这意味着它们需要包含在库中或链接到它。您可以将您的功能保存在单独的库中,如下所示:

gfortran -shared -fPIC -o add.so add.f
f2py -c -m average average.f add.so

将生成一个python模块,该模块本身不包含add,但对于该函数将具有add.so的运行时链接依赖性。

答案 1 :(得分:0)

你们已经想过了,但只是为了建立凯西的回应: 如果你遇到想要避免每次修改average.f时都要重新编译add.f的情况​​,你可以使用静态库,这样你就不必建立到LD_LIBRARY_PATH的链接:

$ gfortran -c add.f
$ f2py -c -m average average.f add.o

上面的第一个命令将生成静态对象(库)文件。第二个使用该目标文件来编译python的最终子例程。