Я использую boost :: python для создания гибридного приложения C++/python: приложение C++ вызывает набор скриптов python, которые, в свою очередь, используют C++ программные функции, классы и т.д., Выставленные как python объекты. (Python 2.x.)
BOOST_PYTHON_MODULE(MyModule)
предоставляет C++ для python, как ожидалось.
Мой код инициализации:
Py_Initialize();
initMyModule(); // import MyModule
namespace bpl = boost::python;
Теперь я хочу, чтобы мой код C++ тоже попал в MyModule
. В python вы просто пишете globals()['MyModule']
. Но это (и тому подобное) не работает в C++:
bpl::object globals = bpl::eval("globals()");
Это не удается во время выполнения с
File "<string>", line 1, in <module>; NameError: name 'globals' is not defined
В стороне, я вижу много примеров настройки __main__
следующим образом:
bpl::object m = bpl::import("__main__");
bpl::dict g = m.attr("__dict__"); // like locals(), but not globals()
Это не подводит, и дает локали, но, согласно документам Py_Initialize, __main__
уже настроен. И это не позволяет вам видеть глобальные переменные, где вы найдете свой импортированный модуль.
Вам не нужен явный bpl::import("__main__");
,
Вот глобалы:
bpl::dict globals()
{
bpl::handle<> mainH(bpl::borrowed(PyImport_GetModuleDict()));
return bpl::extract<bpl::dict>(bpl::object(mainH));
}
Поскольку все управляется с помощью умных указателей, возврат и управление bpl::dict
напрямую работает нормально.
bpl::object myMod = globals()["MyModule"];
globals()["myNewGlobal"] = 88;