Python-Bindungen, wie funktioniert das?

Lesezeit: 3 Minuten

Ashims Benutzeravatar
wie er

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.

  • 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

Benutzeravatar von Yak
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

Benutzeravatar von Anurag Uniyal
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

1412870cookie-checkPython-Bindungen, wie funktioniert das?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy