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
Vielen Dank. Arbeiten!!! –
sollten Sie am Ende nicht 'Py_Finalize();' aufrufen? –
@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. –