Der Code, den ich unten zeige, funktioniert, aber ich bin mir nicht ganz sicher warum .
Ich benutze:
Dieser Code stammt hauptsächlich aus diesem Video-Tutorial und git Seite , funktionierte aber leider nicht "out of the box".
Das Ziel dieses Wrappings besteht darin, den Zugriff durch Python auf eine triviale C-Funktion zu ermöglichen, die entweder Ganzzahlen oder eine Ganzzahlenstruktur akzeptiert und zusammenfügt.
Dafür werden 5 Dateien benötigt, die im Folgenden beschrieben werden:
adder.c
: C-Code der beiden Addiererfunktionen: add (Skalareingaben) und pair_add (Struktureingaben) adder.h
: Header-Datei für adder.c c_adder.pxd
: Eine Cython-Header-Datei - teilt Cython im Wesentlichen mit, welche Teile der Haupt-Header-Datei auf cy_adder.pyx
: Der Cython-Code, mit dem beide Funktionen im Python-Namespace definiert werden setup.py
: Eine distutils-Datei, die den Cython-Code kompiliert und der Prozess erzeugt zwei Dateien
c_adder.c
: Eine Cython-C-Zwischendatei c_adder.so
: Das Python-Modul, das in einen Namespace Die Eingabedateien sind unter:
adder.c
%Vor%adder.h
%Vor%c_adder.pxd
%Vor%cy_adder.pyx
%Vor%setup.py
%Vor%Ich konnte erfolgreich eine .so-Datei durch Ausführen von
erstellen %Vor% Im selben Verzeichnis wie die obigen Dateien. Es ist dann möglich, cy_adder
in den Namespace eines Python-Interpreters zu laden.
In der Setup-Deklaration habe ich adder.c
als Hilfsmodul eingefügt.
Wenn ich dies nicht tue Beim Importieren der .so
-Datei erhalte ich den folgenden Fehler:
Gibt es einen Schritt, den ich vermisse, was bedeutet, dass ich adder.c
nicht zusammen mit meinem Setup-Befehl übergeben muss? Stelle ich mich dabei einer möglichen Instabilität gegenüber?
Die Datei adder.c
muss irgendwo referenziert werden, damit sie weiß, wo die Implementierung von add
zu finden ist. Wie Sie festgestellt haben, funktioniert adder.c
als zusätzliche Quelldatei. Eine gebräuchlichere Methode zur Verwendung externer (gemeinsamer) C-Bibliotheken besteht darin, sie als libadder.so zu kompilieren und über den Parameter libraries
in Ihrer Extension-Deklaration zu verknüpfen.
Für etwas so einfaches könntest du auch einfach
schreiben %Vor%oder setzen Sie die gesamte Implementierung in die .h-Datei.