2016-07-27 7 views
3

Ich bin total neu in boost.python. Ich habe viele Vorschläge zur Verwendung von boost.python zur Anwendung mit Python gelesen, aber immer noch nicht leicht zu verstehen und eine Lösung für mich zu finden.Wie importiere ich eine Funktion von Python-Datei von Boost.Python

Was ich will, ist eine Funktion oder Klasse zu importieren, die direkt aus einem Python „Sourcefile“

Beispiel File: Main.cpp MyPythonClass.py

Lassen Sie uns sagt, ob es einen „Hund“ ist Klasse in "MyPythonClass.py" mit der Funktion "bark()", wie bekomme ich Callback und send Argument in cpp?

Ich habe keine Ahnung, was ich tun soll! Bitte helfen Sie mir!

Antwort

5

Wenn man Python von C aufrufen muss ++ und C++ besitzt die Hauptfunktion, dann muss man einbetten die Python Unterbrecher innerhalb des C++ Programms. Die Boost.Python-API ist keine vollständige Wrapper-Umgebung für die Python/C-API. Daher könnte es notwendig sein, Teile der Python/C-API direkt aufzurufen. Nichtsdestotrotz kann die API von Boost.Python die Interoperabilität erleichtern. Lesen Sie den offiziellen Boost.Python embedding tutorial für weitere Informationen.


Hier ist ein Grundgerüst für ein C++ Programm, das Python bettet:

int main() 
{ 
    // Initialize Python. 
    Py_Initialize(); 

    namespace python = boost::python; 
    try 
    { 
    ... Boost.Python calls ... 
    } 
    catch (const python::error_already_set&) 
    { 
    PyErr_Print(); 
    return 1; 
    } 

    // Do not call Py_Finalize() with Boost.Python. 
} 

Wenn Python einbetten, kann es notwendig sein, die module search path über PYTHONPATH so zu erweitern, dass die Module von benutzerdefinierten Orten importiert werden können .

// Allow Python to load modules from the current directory. 
setenv("PYTHONPATH", ".", 1); 
// Initialize Python. 
Py_Initialize(); 

Oft bietet die Boost.Python-API eine Möglichkeit, C++ - Code python-isch zu schreiben. Das folgende Beispiel demonstrates ein Python-Interpreter in C++ Einbetten, und mit C einen MyPythonClass Python Modul aus Platten importieren ++ eine Instanz von MyPythonClass.Dog, instanziiert und dann bark() Aufruf auf das Dog Beispiel:

#include <boost/python.hpp> 
#include <cstdlib> // setenv 

int main() 
{ 
    // Allow Python to load modules from the current directory. 
    setenv("PYTHONPATH", ".", 1); 
    // Initialize Python. 
    Py_Initialize(); 

    namespace python = boost::python; 
    try 
    { 
    // >>> import MyPythonClass 
    python::object my_python_class_module = python::import("MyPythonClass"); 

    // >>> dog = MyPythonClass.Dog() 
    python::object dog = my_python_class_module.attr("Dog")(); 

    // >>> dog.bark("woof"); 
    dog.attr("bark")("woof"); 
    } 
    catch (const python::error_already_set&) 
    { 
    PyErr_Print(); 
    return 1; 
    } 

    // Do not call Py_Finalize() with Boost.Python. 
} 

Bei einem MyPythonClass Modul, das enthält :

class Dog(): 
    def bark(self, message): 
     print "The dog barks: {}".format(message) 

Das obige Programm Ausgänge:

The dog barks: woof 
+0

Vielen Dank. Arbeiten!!! –

+0

sollten Sie am Ende nicht 'Py_Finalize();' aufrufen? –

+0

@TrevorHickey, nein. Wie in der [Boost.Python-Einbettungsdokumentation] (http://www.boost.org/doc/libs/1_65_1/libs/python/doc/html/tutorial/tutorial/ embedding.html) erwähnt, 'Py_Finalize()' sollte nicht aufgerufen werden, um den Dolmetscher zu stoppen. –

0

Boost python wird verwendet, um cplusplus-Funktionen von einer Python-Quelle aus aufzurufen. Ziemlich genau wie das Perl xs Modul.

Wenn Sie in main.cpp eine Funktion namens bark() haben, können Sie boost python verwenden, um diese main.cpp in ein aufrufbares Python-Modul umzuwandeln.

dann von Python-Skript (unter der Annahme Link Ausgabedatei main.so wird):

import main 
main.bark() 
+0

Sorry, ich denke vielleicht gibt es ein Missverständnis. Ich muss in C++ Umgebung arbeiten, also möchte ich mein C++ Programm direkt Dog.bark() von python benutzen .... nicht in python –

+0

Boost Python hilft dir nicht dort . Boost ist ein C++ Modul. versuchen Sie dies https://docs.python.org/3/extending/embedding.html – kbang

Verwandte Themen