https://developers.facebook.com/tools/explorer
假设我有以下来源的目录(位于底部的代码):
system: lubuntu 18.04, running in VirtualBox
/f2pyproject/
- lib.f
- prog.f
- f2pyprog.f
- test.py
是一个简单的fortran可执行文件,它将在从prog.f
编译的共享对象中调用子例程。
要实现这一目标:
lib.f
其中>>> gfortran -shared lib.f -o lib.so
>>> gfortran prog.f lib.so -o prog.exe -Wl,-rpath=.
>>> ./prog.exe
hello world
选项告诉prog.exe在当前目录中查找其链接的共享对象,这样我就不必担心-Wl,-rpath=.
现在我想在python中调用此相同的链接子例程,因此我通过f2py调用来编译f2pyprog.f:
$LD_LIBRARY_PATH
现在,在这种情况下,>>> python3 -m numpy.f2py -c f2pyprog.f lib.so -m prog
是共享对象,而不是可执行文件,所以我不知道的是,如何调用此工作流而不必担心LD_LIBRARY_PATH却将共享对象保持在同一状态目录作为f2py编译库。
调用test.py失败:
prog.cpython-blah-blah.so
首先成功设置LD_LIBRARY_PATH:
>>> python3 test.py (fails with ImportError, cannot open shared object file)
是否可以使用-rpath链接器选项之类的东西,通过在当前目录中链接的共享对象来构建此(或任何)f2py扩展名,而不必担心>>> export LD_LIBRARY_PATH=`pwd`
>>> python3 test.py
hello world
环境变量?
lib.f:
$LD_LIBRARY_PATH
prog.f:
subroutine helloworld()
print*, "hello world"
return
end subroutine
f2pyprog.f:
program helloworldprog
call helloworld()
end program helloworldprog
test.py
subroutine pyhelloworld()
call helloworld()
return
end subroutine
答案 0 :(得分:1)
export LDFLAGS=-Wl,-rpath=.
export NPY_DISTUTILS_APPEND_FLAGS=1
numpy
升级到1.16.0
或更高版本尽管不能从f2py的命令行传递链接器标志,但它将读取LDFLAGS
环境变量。但是,默认behavior for numpy is to overwrite the flags用于编译而不是附加它们,如果LDFLAGS
中不存在必需的标志,则将导致编译失败。 Support was added in numpy
version 1.16.0
用于通过设置环境变量NPY_DISTUTILS_APPEND_FLAGS=1
>>> unset LD_LIBRARY_FLAGS # just in case was set before
>>> export LDFLAGS=-Wl,-rpath=.
>>> export NPY_DISTUTILS_APPEND_FLAGS=1
>>> python3 -m numpy.f2py -c progpy.f lib.so -m prog
>>> python3 test.py
hello world