Minimales Beispiel für das Umbrechen von C-Code mit Cython - Übergabe von int und struct

8

Der Code, den ich unten zeige, funktioniert, aber ich bin mir nicht ganz sicher warum .

Ich benutze:

  • Mac OSX 10.8.5
  • Gebraut Python 2.7.5
  • Cython 0,20.2

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
  • zu achten sind
  • 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
  • importiert werden kann

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.

Die Frage

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:

%Vor%

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?

    
Solar_code 08.07.2014, 00:13
quelle

1 Antwort

2

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.

    
robertwb 03.01.2015, 04:55
quelle

Tags und Links