2012-04-18 6 views
18

Ich untersuche Python. Ich bin neugierig auf Python-Bindungen. Könnte irgendjemand erklären, wie es möglich ist, dass Sie von Python aus Zugriff auf C-Bibliotheken haben.Python-Bindungen, wie funktioniert es?

+1

Welcher Teil von [extemb] (http://docs.python.org/extending/index.html) verstehen Sie nicht? –

+1

Ich schlage vor, dass Sie eine Google-Suche nach "Python C-Bindungen" durchführen. – steveha

+2

"Ich erkunde Python."Alles über Python zu lernen ist eine großartige Sache, aber Sie sollten das Python-Modell wahrscheinlich sehr gut verstehen, bevor Sie zu tief in die C-Bindungen schauen. Sie werden verstehen, wie das Servolenkungsgerät viel besser funktioniert, sobald Sie fahren können –

Antwort

25

Es gibt mehrere Möglichkeiten, in C geschriebenen Code aus Python aufzurufen.

Zuerst gibt es das Modul in der Standardbibliothek. Es ermöglicht Ihnen, eine Dynamic-Link-Bibliothek (DLL unter Windows, gemeinsame Bibliotheken .so unter Linux) zu laden und Funktionen aus diesen Bibliotheken direkt aus Python aufzurufen. Solche Bibliotheken werden normalerweise in C geschrieben. Im Fall von CPython gibt es zweitens die API Python/C. Es kann auf zwei Arten verwendet werden:

Eine Dynamic-Link-Bibliothek kann in C geschrieben werden, so dass CPython es als ein Modul behandelt (Sie können es in Ihre Python-Programme importieren). Die Python/C-API erlaubt der Bibliothek, Funktionen zu definieren, die in C geschrieben sind, aber immer noch von Python aufgerufen werden können. Die API ist sehr leistungsfähig und bietet Funktionen, um alle Python-Datentypen zu bearbeiten 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 Module zu erstellen und C-Funktionen zu offenbaren, ähnlich wie beim dynamischen Link Bibliotheksansatz. Die API ermöglicht dem Programm auch das Ausführen von Skripts, 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 mit Ctypes oder als Dynamic-Link-Bibliothek mit Python/C-API implementiert. Die zweite Option wird manchmal mit Tools wie SWIG verwendet, die die Aufgabe erleichtern, indem sie den Code "boiler-plate" generieren oder Boost.Python, der eine C++ - API zusätzlich zur Python/C-API bereitstellt, die die Verbindung mit C++ - Code erleichtert.

Weitere lesen: Foreign Function Interface

6

Die Antwort ist einfach, Python (CPython) Interpreter ist in C geschrieben und kann andere C-Bibliotheken dynamisch aufrufen, Ihr C-Erweiterungsmodul oder eingebetteter C-Code kann einfach von jedem anderen C-Code aufgerufen werden.

CPython erlaubt spezielle Hooks, damit es anderen C-Code aufrufen kann oder aus anderem C-Code aufgerufen werden kann. Es braucht nicht einmal C zu sein, irgendeine Sprache, die zu nativem Code kompiliert und dieselbe Aufrufkonvention hat.

Für einen einfachen Fall erwägen Sie, ein Programm namens mython zu erstellen, das jede gemeinsam genutzte Bibliothek laden kann und versucht, eine Funktion run z.

lib = dlopen("mylib.so", RTLD_LAZY); 
func = dlsym(lib, "run"); 
(*func)(); 

So in Art und Weise haben Sie ein Modul geladen und seinen Code genannt, tut CPython, dass aber in komplexeren Art und Weise, eine bessere Schnittstellen und Gegenständen, um zu übergeben, und es gibt andere Feinheiten der Speicherverwaltung beteiligt sind, Thread-Management etc.

Also Plattform der Python-Implementierung muss mit Sprache übereinstimmen, in der es erweitert wird, z CPython ist in Java nicht erweiterbar, aber die Java-Implementierung von Python mit der Bezeichnung Jython kann in Java erweitert werden und ähnlich. Die .NET-Implementierung IronPython kann in .Net-Sprachen erweitert werden.

+2

Viele Dinge sind in C geschrieben. Aber viele Sachen, die in C * geschrieben sind, sind in C nicht erweiterbar. Was Python besonders macht ? –

+0

@Annag Ist es richtig, dass Python nicht erweiterbar ist, sagen wir, Java? – ashim

+0

@ IgnacioVazquez-Abrams siehe bearbeiten –