2013-11-21 3 views
0

Я использую boost :: python для создания гибридного приложения C++/python: приложение C++ вызывает набор скриптов python, которые, в свою очередь, используют функции, классы и т. Д. Программы C++, которые отображаются как объекты python. (Python 2.x.)boost :: python hybrid embedding/exposing: как я могу получить globals() и увидеть мой собственный модуль?

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() 

Это не fail, и дает locals, но согласно 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;