Ich erforsche Python. Ich bin neugierig auf Python-Bindungen. Könnte jemand erklären, wie es möglich ist, dass Sie von Python aus auf C-Bibliotheken zugreifen können.
Python-Bindungen, wie funktioniert das?
wie er
Yak
Es gibt mehrere Möglichkeiten, in C geschriebenen Code von Python aus aufzurufen.
Da ist zunächst die ctypen Modul in der Standardbibliothek. Damit können Sie eine Dynamic Link Library (DLL unter Windows, Shared Libraries .so
unter Linux) und rufen Sie Funktionen aus diesen Bibliotheken direkt aus Python auf. Solche Bibliotheken sind normalerweise in C geschrieben.
Zweitens, im Falle von CPython
dort ist der Python/C API. Es kann auf zwei Arten verwendet werden:
Eine Dynamic-Link-Library kann so in C geschrieben werden, dass CPython
wird es als Modul behandeln (Sie können es in Ihre Python-Programme importieren). Die Python/C-API ermöglicht es der Bibliothek, Funktionen zu definieren, die in C geschrieben sind, aber dennoch von Python aufgerufen werden können. Die API ist sehr leistungsfähig und bietet Funktionen, um alle Python-Datentypen zu manipulieren und auf die Interna des Interpreters zuzugreifen.
Die zweite Möglichkeit, die C-API zu verwenden, besteht darin, Python in ein in C geschriebenes Programm einzubetten. Das C-Programm ist dann in der Lage, in C geschriebene integrierte Module zu erstellen und C-Funktionen verfügbar zu machen, ähnlich wie beim Dynamic-Link-Library-Ansatz. Die API ermöglicht es dem Programm auch, Skripte auszuführen, die dann die integrierten Module importieren und verwenden können. Dies kann verwendet werden, um ein Python-basiertes Plug-In-System zu erstellen.
“Bindings” werden entweder als reine Python-Bibliothek unter Verwendung von implementiert ctypes
oder als Dynamic-Link-Bibliothek mit Python/C-API. Die zweite Option wird manchmal mit Tools wie verwendet SCHLUCK die die Aufgabe erleichtern, indem sie sich um die Generierung des “Boiler-Plate” -Codes kümmern oder Boost.Python die eine C++-API zusätzlich zur Python/C-API bereitstellt, wodurch die Schnittstelle mit C++-Code vereinfacht wird.
Lesen Sie weiter: Fremdfunktionsschnittstelle
-
Kann jemand einen Democode oder ein Repo bereitstellen, um zu simulieren, wie es tatsächlich in der einfachsten Form funktioniert? Das wäre wirklich hilfreich.
– Heidekraut
14. August 2021 um 5:28 Uhr
Anurag Uniyal
Die Antwort ist einfach, der Python (CPython)-Interpreter ist in C geschrieben und kann andere C-Bibliotheken dynamisch aufrufen, Ihr C-Erweiterungsmodul oder eingebetteter C-Code kann problemlos von jedem anderen C-Code aufgerufen werden.
CPython erlaubt spezielle Hooks, sodass es anderen C-Code aufrufen oder von anderem C-Code aufgerufen werden kann. Es muss nicht einmal C sein, eine Sprache, die in nativen Code kompiliert wird und dieselbe Aufrufkonvention hat.
Stellen Sie sich für einen einfachen Fall vor, Sie erstellen ein Programm namens mython, das jede gemeinsam genutzte Bibliothek laden kann und versucht, eine Funktion aufzurufen run
z.B
lib = dlopen("mylib.so", RTLD_LAZY);
func = dlsym(lib, "run");
(*func)();
So wie Sie ein Modul geladen und seinen Code aufgerufen haben, tut CPython dies, aber auf komplexere Weise, indem es bessere Schnittstellen und Objekte zum Umherreichen bereitstellt, und es gibt noch andere Feinheiten bei der Speicherverwaltung, Thread-Verwaltung usw.
Daher muss die Plattform der Python-Implementierung mit der Sprache übereinstimmen, in der sie erweitert wird, z. B. ist CPython in Java nicht erweiterbar, aber die Java-Implementierung von Python wird aufgerufen Jython kann in Java und ähnlich .NET-Implementierung erweitert werden IronPython kann in .Net-Sprachen erweitert werden.
-
Vieles ist in C geschrieben. Aber vieles, was in C geschrieben ist ist nicht erweiterbar in C. Was macht Python so besonders?
– Ignacio Vazquez-Abrams
18. April 2012 um 3:33 Uhr
-
@Anurag Ist es richtig, dass Python nicht auf Java erweiterbar ist?
– wie er
18. April 2012 um 4:05 Uhr
-
@ashim: CPython ist die C-Implementierung von Python. JPython, wo der Python-Interpreter in Java implementiert ist, kann verwendet werden, um Java-Code aufzurufen.
– Johannesgrün
5. Februar 2020 um 15:15 Uhr
Ich schlage vor, dass Sie eine Google-Suche nach “Python C-Bindungen” durchführen.
– steveha
18. April 2012 um 3:33 Uhr
2017 ist diese Frage das Top-Ergebnis für “Python C-Bindungen” 🙂
– Ben Fulton
15. September 2017 um 19:05 Uhr