python numpy distutils lapack f2py

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_