2012-11-21 6 views
7

Ich habe ein Szenario, in dem ich einige Funktionen in C++ Klassen haben, und ich möchte, dass sie anrufen können, ein Python-Skript verwenden. Lassen Sie uns sagen, dass ich eine FunktionAufruf einer C++ Funktionen durch ein Python-Skript

void greet(_msg); 
    std::cout >> _msg >> std::endl; 

Ich will es in der Lage sein müssen, rufen Trog einen Anruf benutzerdefinierte Python und übergeben Argumente, um es zum Beispiel

saySomething("Hello") 

Als Py-Datei ich es will um die Greet-Funktion aufzurufen und "Hello" als Argument zu übergeben.

Ich weiß, es ist ein Thema, das gründlich diskutiert wurde, und ich habe einen Teil der Forschung über die Einbettung von Python in C++ getan, ich konnte Werte aus einem Python-Skript mit der Standard-Python/C-API lesen und ausführen eine Funktion in Python von C++ und pass Argument dazu, aber ich kann nicht scheinen, um zu verstehen, wie man dieses spezifische Ergebnis erreicht.

Ich habe mir ctypes und verschiedene Wrappin-Bibliotheken angeschaut wie boost: python oder swig, aber ich kann nicht zu verstehen scheinen, in welchem ​​Grad sie mir helfen können, was ich will.

+0

"Ausführen einer Funktion in Python von C++" Was meinst du damit? Wenn Sie C/C++ als Python-API maskieren möchten, können Sie die Grundregeln der Python-Bindungen für C/C++ anwenden. Es gibt auch die boost :: python-Bibliothek, die beim Schreiben der Python-API einfacher von C++ - Code aus gehandhabt werden kann. – user1797612

+0

Entschuldigung, es war nicht klar - Was ich will, ist ein Python-Skript, das eine bestimmte Funktion einer C++ - Klasse aufruft, die Argumente übergeben kann. Mehr oder weniger wie eine GUI, sondern durch Python-Skripte anstelle von Schaltflächen. – leoncvlt

+0

Sie suchen also http://docs.python.org/3.2/extending/extending.html oder boost :: python (wahrscheinlich einfacher), und auch die Antworten auf diese Frage können ein guter Ausgangspunkt http sein: //stackoverflow.com/questions/276761/exposing-ac-api-to-python. Wie auch immer, Sie wollen Python API für C++ Code generieren, das ist es, folgen Sie einfach dem offiziellen Handbuch oder verwenden Sie diese Bibliotheken. – user1797612

Antwort

5

Je nachdem, welche Version von Python Sie daran interessiert sind, 2.x oder 3.x, lesen Sie die Erweiterung und Einbettung der Python-Interpreter Kapitel für 2.x oder 3.x. Sie sind nur an Verlängerung interessiert Python, so Abschnitt der 1. Erweitern von Python mit C oder C++ bieten Ihnen vollständige Erklärung, wie Sie implementieren, was Sie benötigen, um Ihre Funktionen in C++ aus Python-Skript aufgerufen werden können .

Sicherlich gibt es zahlreiche Bibliotheken und Generatoren mit denen Sie C/C++ APIs für Python (zB Boost.Python oder SWIG), aber Ihr Fall klingt einfach genug, dass zum Zweck des Lernens ist es IMO besser kennen zu lernen wickeln mit Python C API. Selbst wenn Sie diese Tools verwenden, müssen Sie sich häufig mit der Python C-API vertraut machen oder sie zumindest verstehen.

3

Mit der Funktion wove.inline(), die Teil des scipy-Pakets ist, können Sie C/C++ - Dateien kompilieren und ausführen und deren Ausgabe über Ihr Python-Skript abrufen.

4

Ich musste diese Sache gerade erst machen. Boost.Python tut, was wir suchen (und mehr), aber persönlich (so sehr ich Boost liebe) finde ich es ein wenig übertrieben, die Hälfte der Boost-Bibliothek ziehen zu müssen, um ein Feature zu bekommen. SWIG war auch nicht wirklich eine Option für mich, da die Code-Generierung immer mühsam zu warten ist, während sich die Klassenstrukturen ändern (Versteht mich nicht falsch, das sind BRILLIANT-Lösungen!), Nicht das, wonach ich gesucht habe.

Also, das einzige, was für mich übrig war es aus ersten Prinzipien (Python/C API) zu implementieren. Hense, "ECS: Python" wurde geboren. ECS: Python (Embedded C++ Scripting mit Python) ist eine einfache C++ - Python-Wrapper-Bibliothek, die ich speziell für C++ - Entwickler entwickelt habe. Es ermöglicht Ihnen, Objekte aus einer C++ - Anwendung für einen interaktiven Python-Interpreter für interaktive Skripts verfügbar zu machen, und es ist sehr leicht und einfach zu bedienen.

Seine freie (BSD) und Open Source. Wenn Sie hier interessiert sind, ist es: http://sourceforge.net/projects/ecspython

+0

Willkommen auf dem Stapel. –

+0

Danke Miguel-F :) –

Verwandte Themen