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?
was denken Sie über die Antwort von @cronos? Gibt es einen Grund, warum Sie keine Ctypes verwenden können? –
@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. –