Можно ли обернуть функцию из общей библиотеки, используя F2PY?
Я разрабатываю пакет, который требует привязки Python для dgtsv
подпрограммы из библиотеки LAPACK Fortran. На данный момент я распространяю исходный файл Fortran, dgtsv.f
, вместе с моим кодом Python и используя numpy.distutils
, чтобы автоматически обернуть его и скомпилировать в общую библиотеку _gtsv.so
, которая может быть вызвана из Python.
Вот как выглядит мой файл setup.py
на данный момент:
from numpy.distutils.core import setup, Extension, build_ext
import os
fortran_sources = ["dgtsv.f"]
gtsv = Extension(
name="pyfnnd._gtsv",
sources=[os.path.join("pyfnnd", "LAPACK", ff) for ff in fortran_sources],
extra_link_args=['-llapack']
)
setup(
name='pyfnnd',
py_modules=['_fnndeconv', 'demo', '_tridiag_solvers'],
cmdclass={'build_ext': build_ext.build_ext},
ext_modules=[gtsv],
)
Обратите внимание, что для фактического использования _gtsv.so
мне все равно придется ссылаться на ранее существовавшую библиотеку LAPACK (extra_link_args=['-llapack']
). Поскольку эта библиотека уже должна содержать подпрограмму dgtsv
, мне кажется, что было бы просто просто обернуть функцию в существующей общей библиотеке, вместо того, чтобы распределять фактический источник Fortran.
Однако я никогда не сталкивался с примерами использования F2PY для переноса функций, которые являются частью общей библиотеки, а не только исходного исходного кода Fortran. Возможно ли это?
Ответы
Ответ 1
Мне кажется, вам просто нужны ctypes, есть полный пример вызова функции lapack
на этой странице: http://www.sagemath.org/doc/numerical_sage/ctypes.html
Вы получаете свою функцию следующим образом:
import ctypes
from ctypes.util import find_library
lapack = ctypes.cdll.LoadLibrary(find_library("lapack"))
dgtsv = lapack.dgtsv_