我正在使用 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 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;






