我可以在带有子例程调用的子例程上使用 F2PY 吗?
Can I use F2PY on a subroutine with subroutine calls?
使用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
添加子程序如下:
subroutine add(a, b, out)
real a, b, out
out = a + b
return
end
尝试 f2py -c -m average average.f 并导入到 python 我得到:
导入错误:./average.so:未定义的符号:add_
此外,向第二个子例程添加意图也不能解决问题。
您需要在编译命令中包含包含 add
的文件,例如
f2py -c -m average average.f add.f
您导入的共享库需要在导入时解析其引用,这意味着它们需要包含在库中或 linked 到它。您可以像这样将函数保存在单独的库中:
gfortran -shared -fPIC -o add.so add.f
f2py -c -m average average.f add.so
这将生成一个 python 模块,该模块本身不包含 add
,但运行时 link 依赖于该函数的 add.so
。
你们已经想到了,但只是为了建立凯西的回应:
如果你 运行 不想每次修改 average.f 都要重新编译 add.f,你可以使用静态库,这样你就不必做一个 link 到 LD_LIBRARY_PATH:
$ gfortran -c add.f
$ f2py -c -m average average.f add.o
上面的第一个命令将生成静态对象(库)文件。第二个使用该目标文件为 python.
编译您的最终子例程
使用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
添加子程序如下:
subroutine add(a, b, out)
real a, b, out
out = a + b
return
end
尝试 f2py -c -m average average.f 并导入到 python 我得到:
导入错误:./average.so:未定义的符号:add_
此外,向第二个子例程添加意图也不能解决问题。
您需要在编译命令中包含包含 add
的文件,例如
f2py -c -m average average.f add.f
您导入的共享库需要在导入时解析其引用,这意味着它们需要包含在库中或 linked 到它。您可以像这样将函数保存在单独的库中:
gfortran -shared -fPIC -o add.so add.f
f2py -c -m average average.f add.so
这将生成一个 python 模块,该模块本身不包含 add
,但运行时 link 依赖于该函数的 add.so
。
你们已经想到了,但只是为了建立凯西的回应: 如果你 运行 不想每次修改 average.f 都要重新编译 add.f,你可以使用静态库,这样你就不必做一个 link 到 LD_LIBRARY_PATH:
$ gfortran -c add.f
$ f2py -c -m average average.f add.o
上面的第一个命令将生成静态对象(库)文件。第二个使用该目标文件为 python.
编译您的最终子例程