python - Boost Python - 全局和本地字典

标签 python c++ boost namespaces

我正在使用 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(因为当我将启动一个新脚本时,我不希望可以调用来自一个非常旧的执行的先前函数定义!)

这是关于命名空间的问题,不是吗?

最佳答案

是的,这是一个命名空间问题。您应该研究 Python 处理范围的方式(特别是“self”关键字)。

简而言之,类成员变量和函数都以“self”为前缀。为了指定它们是当前对象范围的成员。 “Self”与 C++ 和 C# 中的“this”关键字大致相似。

关于python - Boost Python - 全局和本地字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772058/

相关文章:

c++ - Boost动态序列化所有派生类型

c++ - boost::正则表达式-\bb?

python - 为什么我的标签在我的 QHBoxLayout 中堆叠在一起?

python - 将浮点四舍五入到最接近的 2/100

c++ - 解析类似于 C++ 的东西

c++ - 如何摆脱 "Intellisense: no suitable conversion function from "std::string"to "std::string *"exists"错误?

c++ - C++ 中的友元函数

c++ - 每次使用不同的 fixture 多次执行一个测试用例

python - Python 和 matplotlib 的 eps 导出问题

python - 多元线性回归 scikit-learn 和 statsmodel