Ich habe die Aufgabe, eine AC-Bibliothek in eine Python-Klasse zu "verpacken". Die Dokumente sind in dieser Angelegenheit unglaublich vage. Es scheint, dass sie erwarten, dass nur fortgeschrittene Python-Benutzer ctypes implementieren würden. Nun, ich bin ein Anfänger in Python und brauche Hilfe.
Eine Schritt-für-Schritt-Hilfe wäre wunderbar.
Also habe ich meine c Bibliothek. Was mache ich? Welche Dateien lege ich wo ab? Wie importiere ich die Bibliothek? Ich habe gelesen, dass es eine Möglichkeit gibt, Python automatisch zu verpacken.
(Übrigens habe ich das ctypes-Tutorial auf python.net gemacht und es funktioniert nicht. Das heißt, ich denke, sie gehen davon aus, dass ich in der Lage sein sollte, den Rest der Schritte auszufüllen.
In der Tat ist dies der Fehler, den ich mit ihrem Code bekomme:
File "importtest.py", line 1
>>> from ctypes import *
SyntaxError: invalid syntax
Ich könnte wirklich eine Schritt-für-Schritt-Hilfe gebrauchen! Danke ~
quelle
>>>
in importtest.py? Wenn Personen eine Postleitzahl>>>
in jeder Zeile eingeben, bedeutet dies, dass sie in der interaktiven Shell ausgeführt wird. Um es aus einer Datei auszuführen, entfernen Sie>>>
(das sind 3> Zeichen und ein Leerzeichen), wo immer es erscheint.>>>
s ein. Diese werden von der interaktiven Shell gedruckt und sollten nicht in Ihrer Quelldatei enthalten sein.>>>
in der .py Datei! AUTSCH! Noch nie gesehen!Antworten:
Hier ist ein schnelles und schmutziges ctypes-Tutorial.
Schreiben Sie zuerst Ihre C-Bibliothek. Hier ist ein einfaches Beispiel für eine Hallo-Welt:
testlib.c
Kompilieren Sie es jetzt als gemeinsam genutzte Bibliothek ( Mac-Fix hier ):
Schreiben Sie dann einen Wrapper mit ctypes:
testlibwrapper.py
Führen Sie es jetzt aus:
Und Sie sollten die Ausgabe sehen
Wenn Sie bereits eine Bibliothek im Sinn haben, können Sie den Nicht-Python-Teil des Tutorials überspringen. Stellen Sie sicher, dass ctypes die Bibliothek finden kann, indem Sie sie in ein
/usr/lib
anderes Standardverzeichnis stellen. In diesem Fall müssen Sie beim Schreiben des Wrappers nicht den vollständigen Pfad angeben. Wenn Sie dies nicht tun, müssen Sie beim Aufruf den vollständigen Pfad der Bibliothek angebenctypes.CDLL()
.Dies ist nicht der richtige Ort für ein umfassenderes Tutorial. Wenn Sie jedoch bei bestimmten Problemen auf dieser Website um Hilfe bitten, hilft Ihnen die Community sicher weiter.
PS: Ich gehe davon aus, dass Sie unter Linux arbeiten, weil Sie verwendet haben
ctypes.CDLL('libc.so.6')
. Wenn Sie ein anderes Betriebssystem verwenden, können sich die Dinge ein wenig (oder ziemlich viel) ändern.quelle
Die Antwort von Chinmay Kanchi ist ausgezeichnet, aber ich wollte ein Beispiel für eine Funktion, die Variablen / Arrays an einen C ++ - Code übergibt und zurückgibt. Ich dachte, ich würde es hier aufnehmen, falls es für andere nützlich ist.
Übergeben und Zurückgeben einer Ganzzahl
Der C ++ - Code für eine Funktion, die eine Ganzzahl verwendet und dem zurückgegebenen Wert eine hinzufügt.
test.cpp
Beachten Sie als Datei das erforderliche externe "C" (dies kann für C-Code entfernt werden). Dies wird mit g ++ kompiliert, mit Argumenten ähnlich wie Chinmay Kanchi Antwort,Der Python-Code verwendet
load_library
unter dernumpy.ctypeslib
Annahme den Pfad zur gemeinsam genutzten Bibliothek im selben Verzeichnis wie das Python-Skript.Dies druckt 6 wie erwartet.
Übergeben und Drucken eines Arrays
Sie können Arrays auch wie folgt übergeben, damit ein C-Code das Element eines Arrays druckt:
die wie bisher kompiliert und auf die gleiche Weise importiert wird. Der zusätzliche Python-Code zur Verwendung dieser Funktion wäre dann:
Dabei geben wir das Array an, das erste Argument
print_array
als Zeiger auf ein Numpy-Array ausgerichteter, c_contiguous 64-Bit-Floats und das zweite Argument als Ganzzahl, die dem C-Code die Anzahl der Elemente im Numpy-Array mitteilt. Dies wird dann durch den C-Code wie folgt gedruckt:quelle
import numpy as np
. Sonst kann esnp.float64
das andere Zeug nicht finden .Erstens: Der
>>>
Code, den Sie in Python-Beispielen sehen, ist ein Weg, um anzuzeigen, dass es sich um Python-Code handelt. Es wird verwendet, um Python-Code von der Ausgabe zu trennen. So was:Hier sehen wir, dass die Zeile, mit
>>>
der beginnt, der Python-Code ist und 9 daraus resultiert. Genau so sieht es aus, wenn Sie einen Python-Interpreter starten, weshalb dies so gemacht wird.Sie geben das
>>>
Teil niemals in eine.py
Datei ein.Das behebt Ihren Syntaxfehler.
Zweitens ist ctypes nur eine von mehreren Möglichkeiten, Python-Bibliotheken zu verpacken. Andere Möglichkeiten sind SWIG , das Ihre Python-Bibliothek überprüft und ein Python C-Erweiterungsmodul generiert, das die C-API verfügbar macht. Eine andere Möglichkeit ist die Verwendung von Cython .
Sie alle haben Vor- und Nachteile.
SWIG macht Ihre C-API nur für Python verfügbar. Das bedeutet, dass Sie keine Objekte oder ähnliches erhalten. Dazu müssen Sie eine separate Python-Datei erstellen. Es ist jedoch üblich, ein Modul namens "wowza" und ein SWIG-Modul namens "_wowza" zu haben, das den Wrapper um die C-API darstellt. Dies ist eine schöne und einfache Art, Dinge zu tun.
Cython generiert eine C-Extension-Datei. Dies hat den Vorteil, dass der gesamte von Ihnen geschriebene Python-Code in C erstellt wird, sodass sich die von Ihnen geschriebenen Objekte auch in C befinden. Dies kann eine Leistungsverbesserung darstellen. Aber Sie müssen lernen, wie es mit C zusammenarbeitet, so dass es ein bisschen mehr Arbeit ist, um zu lernen, wie man es benutzt.
ctypes haben den Vorteil, dass kein C-Code kompiliert werden muss. Daher ist es sehr hilfreich, Standardbibliotheken zu verpacken, die von einer anderen Person geschrieben wurden und bereits in Binärversionen für Windows und OS X vorhanden sind.
quelle