Mientras trabajaba en un proyecto de C++, estaba buscando una biblioteca de terceros para algo que no es mi actividad principal. Encontré una biblioteca realmente buena, haciendo exactamente lo que se necesita, pero está escrita en Python. Decidí experimentar con la incrustación de código Python en C++, utilizando la biblioteca Boost.Python.Python incrustado en CPP: cómo recuperar los datos a CPP
códigoEl C++ es como la siguiente:
#include <string>
#include <iostream>
#include <boost/python.hpp>
using namespace boost::python;
int main(int, char **)
{
Py_Initialize();
try
{
object module((handle<>(borrowed(PyImport_AddModule("__main__")))));
object name_space = module.attr("__dict__");
object ignored = exec("from myModule import MyFunc\n"
"MyFunc(\"some_arg\")\n",
name_space);
std::string res = extract<std::string>(name_space["result"]);
}
catch (error_already_set)
{
PyErr_Print();
}
Py_Finalize();
return 0;
}
A (muy) versión simplificada del código Python se parece a esto:
import thirdparty
def MyFunc(some_arg):
result = thirdparty.go()
print result
Ahora el problema es el siguiente: 'MyFunc' ejecuta bien, puedo ver la impresión de 'resultado'. Lo que no puedo hacer es leer 'resultado' desde el código C++. El comando extraer nunca encuentra 'resultado' en ningún espacio de nombres. Intenté definir 'resultado' como global, incluso intenté devolver una tupla, pero no puedo hacer que funcione.
respuesta mucho más amplia que la mía, a partir de (supongo) un padre compañero :) nosklo, me sugerimos que amplíe su respuesta con un ejemplo PyRun_String; permite más flexibilidad. – tzot
Creo que su 'pArgs = PyTuple_New (0);' debería pasar un 1 no 0. –