Sto sviluppando un pacchetto che richiede binding Python per lo dgtsv
subroutine dalla libreria FORTRan di LAPACK. Al momento, sto distribuendo il file sorgente Fortran, dgtsv.f
, insieme al mio codice Python, e usando numpy.distutils
per avvolgerlo automaticamente e compilarlo in una libreria condivisa, _gtsv.so
, che è richiamabile da Python.È possibile avvolgere una funzione da una libreria condivisa usando F2PY?
Ecco cosa il mio file setup.py
sembra in questo 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],
)
Nota che, al fine di utilizzare effettivamente _gtsv.so
, devo ancora collegare contro una libreria condivisa LAPACK preesistente (extra_link_args=['-llapack']
). Poiché questa libreria dovrebbe già contenere la subroutine dgtsv
, mi sembra che sarebbe più semplice racchiudere la funzione nella libreria condivisa esistente, piuttosto che dover distribuire la sorgente Fortran effettiva.
Tuttavia, non ho mai trovato alcun esempio dell'utilizzo di F2PY per includere funzioni che fanno parte di una libreria condivisa anziché solo il codice sorgente Fortran originale. È possibile?
cosa ne pensi della risposta di @cronos? Qualche ragione per cui non puoi usare i ctype? –
@DebanjanBasu Sì, 'ctypes' farà il trucco. Per qualche ragione non mi è mai venuto in mente - suppongo di essere stato bloccato nella mentalità che avrei avuto bisogno di un metodo specifico di Fortran per avvolgere una libreria condivisa di Fortran. Oh bene. –