2016-07-27 19 views
0

Ich habe ein Programm in C++ geschrieben, das auf eigene Faust funktioniert, aber wir wollen es für Python zugänglich machen. Insbesondere haben wir einige Funktionen, die in C++ effizienter sind, aber wir machen viele andere Dinge mit der Ausgabe mit Python-Skripten. Ich möchte das Ganze von main() in Python nicht neu schreiben, da wir Boosts Wurzelfindungsalgorithmen und andere Funktionalitäten verwenden, die in Python ein Problem darstellen würden.Python-Bindung von Funktionen in einem C++ Programm

Ist es möglich, Python-Bindung zu diesen Funktionen hinzuzufügen, während die C++ main() beibehalten? Ich habe noch nie Python-Bindungen gemacht, aber ich habe mir Boost.python angesehen, da wir bereits Boost verwenden. Die meisten Beispiele verwenden C++ - Funktionen/-Klassen in einer hpp-Datei und betten sie in ein Python-Programm ein, was nicht genau unseren Vorstellungen entspricht.

Wir wollen, dass unser C++ - Programm als Standalone-Programm so bleibt, wie es ist, wenn Benutzer es wollen, und es Benutzern auch erlaubt, diese Funktionen von einem Python-Programm aus aufzurufen. In der Lage zu sein, das gleiche Makefile und exe zu verwenden, wäre großartig. Wir wollen nicht wirklich eine separate C++ - Bibliothek erstellen, die die gebundenen Funktionen enthält; Wir sind nicht daran interessiert, eine Python-Version des Codes zu erstellen, sondern erlauben lediglich den Zugriff auf diese nützlichen Funktionen.

Dank

+1

Mögliches Duplikat von [Aufruf von C/C++ aus Python?] (Http://stackoverflow.com/questions/145270/calling-c-c-from-python) –

+0

Sie benötigen wahrscheinlich GObject Introspection-Bibliothek. – Arunmu

+0

Zumindest mit Cython ist es möglich, Call-Kette wie 'C++ main -> C-Funktion in Cython implementiert -> Python-Code -> Python-Modul in Cython implementiert -> C++ - Code ...'. Es ist wahrscheinlich auch mit Boost.python möglich. –

Antwort

1

Wir haben eine umfangreiche C++ Bibliothek, die wir Python durch die Verwendung einer Python-Wrapper-Klasse zur Verfügung gestellt, die eine Schnittstelle aufruft, die wir im Boost-Python definiert.

Eine Python-Klasse behandelt alle Abfragen pythonisch, indem sie ein in C++ geschriebenes Python-Erweiterungsmodul mit boost python aufruft. Die Python-Erweiterung führt C++ - Code aus, sodass sie alles aus der ursprünglichen Bibliothek verknüpfen und verwenden kann.

Sie sagten, dass Ihr C++ eine ausführbare Datei ist. Warum können Sie Systemaufrufe nicht zum Starten eines Shell-Prozesses verwenden? Sie können das in jeder Sprache tun, einschließlich Python. Ich dachte, Sie wollten auf einzelne Funktionen zugreifen, was bedeutet, dass Sie alle Ihre Funktionen in einer statischen Bibliothek benötigen.

Sie erstellen Ihre C++ - Exe normal, die Verknüpfung der gemeinsamen Code. Sie erstellen ein "boost python extension module", das den allgemeinen Code verknüpft und von einem Python-Skript importiert werden kann. Und natürlich eine ausführbare Unit-Testdatei, die den gemeinsamen Code verlinkt und testet. Meine Präferenz ist, dass der gemeinsame Code eine eigenständige statische lib ist (benutze -fPic, wenn es einen posix gcc build gibt).

+0

Erwähnenswert ist die Möglichkeit, eine gemeinsam genutzte Bibliothek (.dll/.so) sowohl als Möglichkeit als auch als statische Bibliothek zu verwenden. –

+0

Das Python-Erweiterungsmodul ist (und muss) eine gemeinsam genutzte Bibliothek (.pyd/.so). Die zugrundeliegende Codebibliothek muss kompatibel mit dieser sein (-fPic), aber wenn sie auch gemeinsam genutzt wird, bedeutet dies, dass Sie sie verteilen müssen und keine Unterschiede zwischen Version und Schnittstelle haben. Risiko ohne Nutzen. –

+0

Bitte beachten Sie, dass die obige Antwort die Verknüpfung einer __static__-Bibliothek mit dem Python-Code erwähnt - das ist falsch. Sie haben auch die Möglichkeit, eine statische Bibliothek für eine ausführbare C++ - Datei und eine gemeinsam genutzte Bibliothek zu erstellen, um sie mit der Python-Schnittstelle in ein Rad zu bündeln. –