如何告诉f2py模块在当前目录中查找共享对象依赖项

时间:2019-01-15 15:29:41

标签: python linux shared-libraries f2py

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

1 个答案:

答案 0 :(得分:1)

  1. 设置环境变量export LDFLAGS=-Wl,-rpath=.
  2. 设置环境变量export NPY_DISTUTILS_APPEND_FLAGS=1
  3. 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