代码之家  ›  专栏  ›  技术社区  ›  Vince W.

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

  •  0
  • Vince W.  · 技术社区  · 6 年前
    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()
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Vince W.    6 年前
    1. 设置env变量 export LDFLAGS=-Wl,-rpath=.
    2. 设置env变量 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
    
    推荐文章