Во время работы над проектом на С++ я искал стороннюю библиотеку для чего-то, что не является моим основным бизнесом. Я нашел действительно хорошую библиотеку, делая то, что нужно, но написан на Python. Я решил поэкспериментировать с вложением кода Python в С++, используя библиотеку Boost.Python.
Код С++ выглядит примерно так:
#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 (очень) упрощенная версия кода Python выглядит следующим образом:
import thirdparty
def MyFunc(some_arg):
result = thirdparty.go()
print result
Теперь проблема заключается в следующем: "MyFunc" отлично работает, я вижу печать "результата". То, что я не могу сделать, это прочитать "результат" из кода на С++. Команда extract никогда не находит "результат" в любом пространстве имен. Я попытался определить "результат" как глобальный, я даже попытался вернуть кортеж, но я не могу заставить его работать.