2014-05-10 3 views
15

Ich entwickle ein Paket, das Python-Bindungen für die dgtsv subroutine aus der LAPACK Fortran-Bibliothek erfordert. Im Moment verteile ich die Fortran-Quelldatei dgtsv.f neben meinem Python-Code und verwende numpy.distutils, um sie automatisch zu umbrechen und in eine gemeinsam genutzte Bibliothek zu kompilieren, _gtsv.so, die von Python aufgerufen werden kann.Ist es möglich, eine Funktion von einer gemeinsam genutzten Bibliothek mit F2PY zu umbrechen?

Hier ist, was meine setup.py Datei wie im Moment aussieht:

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], 
) 

Beachten Sie, dass tatsächlich um _gtsv.so zu verwenden, ich habe noch zu verknüpfen gegen eine vorbestehende LAPACK Shared Library (extra_link_args=['-llapack']). Da diese Bibliothek bereits die Unterroutine dgtsv enthalten sollte, scheint es für mich sauberer zu sein, die Funktion einfach in die vorhandene gemeinsame Bibliothek zu schreiben, anstatt die eigentliche Fortran-Quelle verteilen zu müssen.

Ich habe jedoch nie irgendwelche Beispiele für die Verwendung von F2PY gefunden, um Funktionen zu umbrechen, die Teil einer gemeinsam genutzten Bibliothek sind und nicht nur roher Fortran-Quellcode. Ist das möglich?

+1

was denken Sie über die Antwort von @cronos? Gibt es einen Grund, warum Sie keine Ctypes verwenden können? –

+0

@DebanjanBasu Ja, 'ctypes' werden den Trick machen. Aus irgendeinem Grund ist mir das nie in den Sinn gekommen - ich glaube, ich war in der Denkweise fest, dass ich eine Fortran-spezifische Methode brauchen würde, um eine gemeinsame Fortran-Bibliothek zu verpacken. Naja. –

Antwort

7

Ich glaube, Sie nur ctypes brauchen, gibt es ein vollständiges Beispiel eine lapack Funktion auf dieser Seite zum Aufruf: http://www.sagemath.org/doc/numerical_sage/ctypes.html

Sie erhalten Ihre Funktion wie folgt aus:

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

Prost - das war viel einfacher als ich dachte! Ich werde deine Antwort akzeptieren, aber ich werde bis zum Ende der Bounty-Periode warten, um sie zu vergeben, nur für den Fall, dass jemand andere gute Vorschläge hat. –

Verwandte Themen