我正在使用 boost python 将 python 嵌入到我的 C++ 应用程序中。我是一名 C++ 程序员,对 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);
}
这里的问题是,不同的 C++ 实例PyExpression
修改了相同的全局 python 命名空间,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 模块时,我再次得到 ImportError ,并且再次,命名空间在所有实例之间共享PyExpression
。
简而言之,我希望能够使用命名空间对象/字典,最好是 的类成员PyExpression
,只有该实例PyExpression
可以访问命名空间,并且命名空间可以像全局命名空间一样使用其他模块导入,并且 `globals(), locals(), vars() 都已定义。
如果有人能指出我的工作代码草图,我将非常感激。我找不到关于这个问题的相关材料。