2014-05-10 27 views
15

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?

+1

cosa ne pensi della risposta di @cronos? Qualche ragione per cui non puoi usare i ctype? –

+0

@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. –

risposta

7

Penso basta ctypes, c'è un esempio completo a chiamare una funzione lapack in questa pagina: http://www.sagemath.org/doc/numerical_sage/ctypes.html

Si ottiene la funzione in questo modo:

import ctypes 
from ctypes.util import find_library 
lapack = ctypes.cdll.LoadLibrary(find_library("lapack")) 
dgtsv = lapack.dgtsv_ 
+0

Cheers - era molto più semplice di quanto pensassi! Accetterò la tua risposta, ma aspetterò fino alla fine del periodo di premi per premiarla nel caso qualcuno avesse qualche suggerimento. –

Problemi correlati