Можно ли обернуть функцию из общей библиотеки, используя 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_