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

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

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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector