python - ¿Es posible envolver una función de una biblioteca compartida usando F2PY?
numpy distutils (1)
Estoy desarrollando un paquete que requiere enlaces de Python para la subrutina dgtsv
de la biblioteca LAPACK Fortran. En este momento, estoy distribuyendo el archivo fuente Fortran, dgtsv.f
, junto con mi código Python, y utilizando numpy.distutils
para envolverlo automáticamente y compilarlo en una biblioteca compartida, _gtsv.so
, que se puede llamar desde Python.
setup.py
es como se ve mi archivo setup.py
en este momento:
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],
)
Tenga en cuenta que para utilizar realmente _gtsv.so
, todavía tengo que enlazar con una biblioteca compartida LAPACK preexistente ( extra_link_args=[''-llapack'']
). Como esta biblioteca ya debería contener la subrutina dgtsv
, me parece que sería más limpio simplemente envolver la función en la biblioteca compartida existente, en lugar de tener que distribuir la fuente de Fortran real.
Sin embargo, nunca he encontrado ningún ejemplo de uso de F2PY para envolver funciones que formen parte de una biblioteca compartida en lugar de solo el código fuente de Fortran. es posible?
Creo que solo necesitas ctypes, hay un ejemplo completo sobre lapack
llamar a la función lapack
en esta página: http://www.sagemath.org/doc/numerical_sage/ctypes.html
Obtienes tu función así:
import ctypes
from ctypes.util import find_library
lapack = ctypes.cdll.LoadLibrary(find_library("lapack"))
dgtsv = lapack.dgtsv_