[英]boost::python hybrid embedding/exposing: how do I get globals() and see my own module?
我正在使用boost :: python来执行混合的C ++ / python应用程序:C ++应用程序调用了python脚本的集合,这些脚本随后使用了C ++程序的函数,类等(公开为python对象)。 (Python2.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__
,我看到了许多设置__main__
示例,如下所示:
bpl::object m = bpl::import("__main__");
bpl::dict g = m.attr("__dict__"); // like locals(), but not globals()
这不会失败,并给出了当地人,但根据Py_Initialize文档 , __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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.