Я использую 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
, тоже. В питоне вы просто пишете 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 docs, __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;
Других решений пока нет …