Внедрение / раскрытие гибридного Boost :: Python: как мне получить globals () и увидеть мой собственный модуль?

0

Я использую 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__ уже настроен. И это не позволяет вам видеть глобальные переменные, где вы найдете свой импортированный модуль.

Теги:
boost-python
embedding

1 ответ

0

Вам не нужен явный 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню