我正在使用BoostPython在我的C ++项目中嵌入Python,但我不了解Python的所有内容,尤其是命名空间系统。
实际上,我使用了这段代码:
byte_code = Py_CompileString(filedata, filename, Py_file_input);
// [...]
PyObject* res = NULL;
PyObject* main_module = PyImport_AddModule("__main__");
PyObject* global_dict = PyModule_GetDict(main_module);
PyObject* local_dict = PyDict_New();
py::object local_namespace(py::handle<>(py::borrowed(local_dict)));
// Set a user object (only for this execution)
local_namespace["user_object"] = py::ptr(&MyObject);
res = PyEval_EvalCode( byte_code, global_dict, local_dict );
Py_XDECREF(res);
Py_XDECREF(local_dict);
但是当我执行像:
这样的python脚本时def testB():
print("B")
def testA():
testB() # NameError: global name 'testB' is not defined
testA() # Works
testB() # Works
好的,我可以用
res = PyEval_EvalCode( byte_code, global_dict, global_dict );
而不是
res = PyEval_EvalCode( byte_code, global_dict, local_dict );
但我希望从任何新函数定义中保留global_dict(因为当我将启动一个新脚本时,我不希望调用来自非常旧的执行的先前函数定义!)
这是关于命名空间的问题,不是吗?
答案 0 :(得分:0)
是的,这是命名空间问题。您应该研究Python处理范围的方式(特别是“self”关键字)。
简而言之,类成员变量和函数以“self”为前缀。为了指定它们是当前对象范围的成员。 “Self”与C ++和C#中的“this”关键字非常相似。