我在使用boost python的C++应用程序中嵌入了python。我是一名C++程序员,对Python的知识非常有限。boost python,使用除主全局以外的命名空间
我有一个C++类,PyExpression
。这个类的每个实例都有一个字符串expStr
,这是一个用户输入的短文(在运行时)python程序,通过调用boost::python::exec
执行。简要地说,我已经此设置为:
//import main and its globals
bp::object main = bp::import("__main__");
bp::object main_namespace = main.attr("__dict__");
其中main
和main_namespace
是C++ PyExpression
类的成员。
void PyExpression::Run()
{
bp::object pyrun = exec(expStr,main_namespace);
}
这里的问题是,PyExpression
不同的C++情况下修改同一个全局命名空间蟒,main_namespace
,我希望每个PyExpression
实例有它自己的“全局”命名空间。
如果我通过boost::python::dict class_dict
而不是上面的main_namespace
,它在基本级别上工作。但是,如果PyExpression::expStr
导入模块,例如import sys
,然后我得到一个ImportError
。此外,使用class_dict
,我不能再呼叫globals()
,locals()
,vars()
,因为它们都变得未定义。
我也尝试将PyExpression
作为python模块公开。简单地说,
BOOST_PYTHON_MODULE(PyExpModule)
{
bp::class_<PyExpression>("PyExpression", bp::no_init)
//a couple .def functions
}
int pyImport = PyImport_AppendInittab("PyExpModule", &initPyExpModule);
bp::object thisExpModule = bp::object((bp::handle<>(PyImport_ImportModule("PyExpModule"))));
bp::object PyExp_namespace = thisExpModule.attr("__dict__");
不幸的是,使用PyExp_namespace
,我再次得到了导入错误时要执行字符串进口Python模块,并再次,该命名空间的PyExpression
所有实例之间共享。
总之,我希望能够使用一个命名空间的对象/字典,最好是PyExpression
类成员,有PyExpression
只有该实例可以访问命名空间,命名空间表现得像一个全局命名空间这样可以导入其他模块,并且全部定义了`globals(),locals(),vars()。
如果任何人都可以指向我的工作代码草图,我将非常感激。我无法找到有关此问题的相关材料。