Python und C ++ integrieren

Ich lerne C ++, weil es eine sehr flexible Sprache ist. Aber für Internet Dinge wie Twitter, Facebook, Delicious und andere, Python scheint eine viel bessere Lösung.

Ist es möglich, C ++ und Python in das gleiche Projekt zu integrieren?

10 Solutions collect form web for “Python und C ++ integrieren”

Interfacing Python mit C / C ++ ist keine leichte Aufgabe.

Hier kopiere / füge ich eine vorherige Antwort auf eine vorherige Frage für die verschiedenen Methoden ein, um eine Python-Erweiterung zu schreiben. Mit Boost.Python, SWIG, Pybindgen …

  • Sie können eine Erweiterung selbst in C oder C ++ mit der Python C-API schreiben.

    Mit einem Wort: tu das nicht, außer zu lernen, wie es geht Es ist sehr schwierig, es richtig zu machen. Du musst die Referenzen von Hand inkrementieren und dekrementieren und eine Menge Code schreiben, um nur eine Funktion auszusetzen, mit sehr wenigen Vorteilen.

  • Swig :

    Pro: Sie können Bindungen für viele Skriptsprachen generieren.

    Nachteile: Ich mag nicht, wie der Parser arbeitet. Ich weiß nicht, ob sie einige Fortschritte gemacht haben, aber vor zwei Jahren war der C ++ – Parser ziemlich begrenzt. Die meiste Zeit musste ich meine .h Header kopieren / einfügen, um einige % Zeichen hinzuzufügen und dem Swig Parser zusätzliche Hinweise zu geben.

    Ich musste auch mit der Python C-API von Zeit zu Zeit für (nicht so) komplizierte Typ-Conversions umgehen.

    Ich benutze es nicht mehr.

  • Boost.Python :

    Pro: Es ist eine sehr komplette Bibliothek. Es erlaubt Ihnen, fast alles zu tun, was mit dem C-API möglich ist, aber in C ++. Ich musste nie einen C-API Code mit dieser Bibliothek schreiben. Ich habe auch nie einen Fehler wegen der Bibliothek angetroffen. Code für Bindungen entweder funktioniert wie ein Charme oder weigert sich zu kompilieren.

    Es ist wahrscheinlich eine der besten Lösungen derzeit verfügbar, wenn Sie bereits einige C ++ – Bibliothek zu binden. Aber wenn du nur eine kleine C-Funktion zum Umschreiben hast, würde ich wahrscheinlich mit Cython versuchen.

    Nachteile: Wenn du keine vorkompilierte Boost.Python-Bibliothek hast, wirst du Bjam verwenden (Art eines Ersatzersatzes). Ich hasse wirklich Bjam und seine Syntax.

    Python-Bibliotheken, die mit BP erstellt wurden, neigen dazu, fettleibig zu werden. Es dauert auch viel Zeit, um sie zu kompilieren.

  • Py ++ : Es ist Boost.Python leicht gemacht. Py ++ verwendet einen C ++ – Parser, um Ihren Code zu lesen und erzeugt dann automatisch den Button Boost.Python. Du hast auch eine tolle Unterstützung von seinem Autor (nein, es ist nicht ich ;-)).

    Nachteile: nur die Probleme durch Boost.Python selbst.

    Bearbeiten Sie dieses Projekt sieht nicht weiter. Während es wohl noch funktioniert, kann es besser sein, das Umschalten zu berücksichtigen.

  • Pybindgen :

    Es erzeugt den Code, der sich mit der C-API beschäftigt. Sie können entweder Funktionen und Klassen in einer Python-Datei beschreiben oder Pybindgen Ihre Header lesen und Bindungen automatisch generieren (dafür verwendet sie pygccxml, eine Python-Bibliothek, die vom Autor von Py ++ geschrieben wurde).

    Nachteile: Es ist ein junges Projekt, mit einem kleineren Team als Boost.Python. Es gibt noch einige Einschränkungen: Du kannst deine eigenen C ++ – Ausnahmen nicht aussetzen, du kannst keine Mehrfachvererbung für deine C ++ – Klassen verwenden.

    Jedenfalls lohnt es sich zu versuchen!

  • Pyrex und Cython :

    Hier schreibst du nicht echtes C / C ++ sondern eine Mischung aus Python und C. Dieser Zwischencode erzeugt ein reguläres Python-Modul.

Bearbeiten 22. Juli 2013: Jetzt Py ++ sieht aus, ich suche jetzt eine gute Alternative. Ich experimentiere derzeit mit Cython für meine C ++ – Bibliothek. Diese Sprache ist eine Mischung zwischen Python und C. Innerhalb einer Cython-Funktion können Sie entweder Python- oder C / C ++ – Entitäten (Funktionen, Variablen, Objekte, …) verwenden.

Cython ist ganz einfach zu erlernen, hat eine sehr gute Leistung, und man kann sogar C / C ++ komplett vermeiden, wenn man keine CV ++ Bibliotheken anschließen muss.

Aber für C ++ kommt es mit einigen Problemen. Es ist weniger "automagic" als Py ++ war, also ist es wahrscheinlich besser für stabile C ++ API (was jetzt der Fall meiner Bibliothek ist). Das größte Problem, das ich bei Cython sehe, ist mit C ++ – Polymorphismus. Mit Py ++ / boost: python konnte ich eine virtuelle Methode in C ++ definieren, sie in Python überschreiben und die Python-Version in C ++ aufrufen. Mit Cython ist es immer noch machbar, aber du musst die C-Python API explizit nutzen.

Bearbeiten 2015-12-14:

Es gibt eine neue, pybind11 , ähnlich wie Boost.Python aber mit einigen potenziellen Vorteilen. Zum Beispiel verwendet es C ++ 11 Sprachfunktionen, um es einfacher zu machen, neue Bindungen zu erstellen. Auch ist es eine Header-only-Bibliothek, also gibt es nichts zu kompilieren, bevor Sie es verwenden, und keine Bibliothek zu verknüpfen.

Ich habe mit ihm ein bisschen gespielt und es war ja ganz einfach und angenehm zu bedienen. Meine einzige Angst ist, dass wie Boot.Python es könnte zu lange Compilation Zeit und große Bibliotheken führen. Ich habe noch keinen Benchmark gemacht.

Ja, es ist möglich, ermutigt und dokumentiert . Ich habe es selbst getan und fand es sehr einfach.

Python / C API Referenzhandbuch – die API, die von C- und C ++ – Programmierern verwendet wird, die Erweiterungsmodule schreiben oder Python einbetten möchten.

Erweitern und Einbetten des Python-Interpreters

Beschreibt, wie man Module in C oder C ++ schreibt, um den Python-Interpreter mit neuen Modulen zu erweitern. Diese Module können neue Funktionen definieren, aber auch neue Objekttypen und deren Methoden. Das Dokument beschreibt auch, wie man den Python-Interpreter in eine andere Anwendung einbindet, für die Verwendung als Erweiterungssprache. Schließlich zeigt es, wie man Erweiterungsmodule kompiliert und verknüpft, so dass sie dynamisch (zur Laufzeit) in den Interpreter geladen werden können, wenn das zugrundeliegende Betriebssystem diese Funktion unterstützt.

Versuche Pyrex . Macht das Erstellen von C ++ – Erweiterungen für Python einfacher.

Wir verwenden Swig sehr erfolgreich in unserem Produkt.

Grundsätzlich nimmt swig Ihren C ++ – Code und erzeugt einen Python-Wrapper um ihn herum.

Ich habe PyCxx http://cxx.sourceforge.net/ in der Vergangenheit verwendet und ich fand, dass es sehr gut war.

Es wickelt die Python c API in einer sehr eleganten Art und macht es sehr einfach zu bedienen. Es ist sehr einfach, Python-Erweiterung in c ++ zu schreiben. Es ist mit klaren Beispielen versehen, so dass es leicht ist, loszulegen.

Ich habe es wirklich genossen, diese Bibliothek zu benutzen und ich empfehle es.

Es hängt von Ihren Anforderungen an die Portabilität ab. Ich habe schon seit einiger Zeit damit gekämpft, und ich habe meine C ++ mit der Python-API direkt verpackt, weil ich etwas brauche, das auf Systemen arbeitet, bei denen der Administrator nur eine meist funktionierende gcc- und python-Installation zusammengepackt hat.

In der Theorie Boost.Python sollte eine sehr gute Option sein, da Boost (fast) überall verfügbar ist. Leider, wenn Sie am Ende auf einem Betriebssystem mit einer älteren Standard- Python-Installation (unsere Zusammenarbeit ist mit 2.4 stecken), werden Sie in Probleme laufen, wenn Sie versuchen, Boost.Python mit einer neueren Version (wir alle verwenden Python 2.6). Da Ihr Admin wahrscheinlich nicht die Mühe, eine Version von Boost entsprechend jeder Python-Version zu installieren, müssen Sie es selbst zu bauen.

Also, wenn es Ihnen nichts ausmacht, wenn Sie irgendwelche Boost-Setup auf jedem System benötigen, auf dem Ihr Code läuft, verwenden Sie Boost.Python. Wenn Sie Code wünschen, der definitiv auf einem System mit Python und einem C ++ – Compiler arbeitet, verwenden Sie die Python API.

Sieh dir das an:

Python mit C oder C ++ erweitern

"Es ist ganz einfach, neue eingebaute Module zu Python hinzuzufügen, wenn Sie wissen, wie man in C programmiert. Solche Erweiterungsmodule können zwei Dinge tun, die nicht direkt in Python durchgeführt werden können: Sie können neue eingebaute Objekttypen implementieren , Und sie können C-Bibliotheksfunktionen und Systemaufrufe aufrufen.

Zur Unterstützung von Erweiterungen definiert die Python-API (Application Programmers Interface) einen Satz von Funktionen, Makros und Variablen, die den Zugriff auf die meisten Aspekte des Python-Laufzeitsystems ermöglichen. Die Python-API wird in eine C-Quelldatei aufgenommen, indem sie den Header "Python.h" enthält. "

http://www.python.org/doc/2.5.2/ext/intro.html

PS Es ist buchstabiert "integrieren" 🙂

Eine weitere interessante Art zu tun ist Python-Code-Generierung durch das Ausführen von Python selbst, um c ++ Header-Dateien zu analysieren. OpenCV-Team hat diesen Ansatz erfolgreich gemacht und nun haben sie genau das gleiche getan, um Java-Wrapper für OpenCV-Bibliothek zu machen. Ich fand diese erstellte Cleaner Python API ohne Einschränkung durch eine bestimmte Bibliothek verursacht.

Sie können Python-Erweiterungen in C ++ schreiben. Grundsätzlich ist Python selbst in C geschrieben und du kannst das benutzen, um deinen C-Code aufzurufen. Sie haben vollen Zugriff auf Ihre Python-Objekte. Schauen Sie auch Boost.Python an .

Python ist die beste Programmiersprache der Welt.