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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!