1
我在使用boost python的C++應用程序中嵌入了python。Boost python,使用命名空間調用函數對象
我想能夠調用一個boost python函數對象,並將全局名稱空間與該函數調用關聯。具體而言,簡化了相關代碼:
bp::object main = bp::import("__main__");
bp::object main_namespace = main.attr("__dict__");
//Put the function name runPyProg in the main_namespace
bp::object PyProg = exec(
"import cStringIO\n"
"import sys\n"
"sys.stderr = cStringIO.StringIO()\n"
"def runPyProg(exp):\n"
" print exp\n"
" exec(exp)\n"
" return\n"
"\n",main_namespace);
//Now call the python function runPyProg with an argument
bp::object py_fn = main.attr("runPyProg");
py_fn(expStr)
我知道,當我使用升壓蟒蛇exec()函數,我可以在全局命名空間發送,如上圖所示。我的問題是,當我調用py_fn時,如何將main_namespace與python函數關聯?我的最終目標是將runPyProg的局部變量放置在main_namespace中。
謝謝。
謝謝坦納,該解決方案運行良好! – user773494 2013-05-13 21:39:39
所以我意識到如果我有一個C++類PyExpression,並且類的每個實例都調用boost python exec()來執行它自己的表達式,那麼所有實例實際上都使用相同的全局名稱空間。有沒有辦法將名稱空間的範圍保留到PyExpression的每個C++實例?當我嘗試傳遞未初始化爲main.attr(「__ dict__」)的boost :: python ::對象時,exec()會引發錯誤。 – user773494 2013-05-14 14:45:40
@ user773494:命名空間只是Python中的字典。或者更新'runPyProg'來接受它將執行表達式的命名空間(可能是'PyExpression'實例上的'__dict__'對象),或者使用['inspect'](http://docs.python.org/ 2/library/inspect.html)模塊從堆棧中提取所需的名稱空間。 – 2013-05-14 15:05:43