我在使用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()。
如果任何人都可以指向我的工作代碼草圖,我將非常感激。我無法找到有關此問題的相關材料。