【问题标题】:how to tell f2py module to look in current directory for shared object dependency如何告诉 f2py 模块在当前目录中查找共享对象依赖项
【发布时间】:2019-01-15 15:29:41
【问题描述】:
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_PATH 但将共享对象保存在与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

主要问题:

是否可以使用类似 -rpath 链接器选项的方式在当前目录中链接共享对象来构建这个(或任何)f2py 扩展,而不必担心$LD_LIBRARY_PATH 环境变量?

来源:

lib.f:

  subroutine helloworld()
      print*, "hello world"
  return
  end subroutine

prog.f:

  program helloworldprog
    call helloworld()
  end program helloworldprog

f2pyprog.f:

  subroutine pyhelloworld()
    call helloworld()
  return
  end subroutine

test.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()

【问题讨论】:

    标签: python linux shared-libraries f2py


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 2013-07-03
      • 2015-10-28
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多