как заставить модуль f2py искать в текущем каталоге зависимость общего объекта - PullRequest
0 голосов
/ 15 января 2019
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, поэтому я компилирую f2pyprog.f с вызовом f2py:

>>> 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

Основной вопрос:

Возможно ли построить это (или любое) расширение f2py с общим объектом, связанным в текущем каталоге, используя что-то вроде опции -rpath linker и не беспокоясь о переменной окружения $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()

1 Ответ

0 голосов
/ 15 января 2019
  1. установить переменную env export LDFLAGS=-Wl,-rpath=.
  2. установить переменную env export NPY_DISTUTILS_APPEND_FLAGS=1
  3. повышение numpy до 1.16.0 или выше

Хотя вы не можете передать флаги компоновщика из командной строки в f2py, он будет читать переменную окружения LDFLAGS. Однако стандартное поведение для numpy: перезаписать флаги , используемые при компиляции, а не добавлять их, что приведет к сбою при компиляции, если требуемые флаги отсутствуют в LDFLAGS. Добавлена ​​поддержка в numpy версии 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...