system: lubuntu 18.04, running in VirtualBox
假设我有以下源目录(代码位于底部):
/f2pyproject/
- lib.f
- prog.f
- f2pyprog.f
- test.py
prog.f
是一个简单的Fortran可执行文件,它将调用从中编译的共享对象中的子例程
lib.f
.
要实现这一点:
>>> gfortran -shared lib.f -o lib.so
>>> gfortran prog.f lib.so -o prog.exe -Wl,-rpath=.
>>> ./prog.exe
hello world
何处
-Wl,-rpath=.
选项告诉prog.exe在当前目录中查找其链接的共享对象,这样我就不必担心
$LD_LIBRARY_PATH
现在我想在python中调用这个相同的链接子例程,所以我用f2py调用编译f2pyprog.f:
>>> python3 -m numpy.f2py -c f2pyprog.f lib.so -m prog
在这种情况下,
prog.cpython-blah-blah.so
是一个共享对象,而不是一个可执行文件,所以我不知道的是,如何在不必担心ld_library_路径的情况下调用此工作流,而将共享对象保持在与f2py编译库相同的目录中。
调用test.py失败:
>>> python3 test.py (fails with ImportError, cannot open shared object file)
首先设置ld_library_path成功:
>>> export LD_LIBRARY_PATH=`pwd`
>>> python3 test.py
hello world
主要问题:
是否可以用当前目录中链接的共享对象来构建这个(或任何)f2py扩展,方法是使用-rpath linker选项,而不必担心
$ld_库路径
环境变量?
资料来源:
自由:
subroutine helloworld()
print*, "hello world"
return
end subroutine
F:
program helloworldprog
call helloworld()
end program helloworldprog
F2PYPROG.F:
subroutine pyhelloworld()
call helloworld()
return
end subroutine
Py
import os
from os import path
# has no effect, presumably because this needs to be set before python starts
os.environ['LD_LIBRARY_PATH'] = path.abspath(path.dirname(__file__))
import prog
prog.pyhelloworld()