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