gpt4 book ai didi

python - 在 python C API 中创建模块时如何包含 __build_class__

转载 作者:行者123 更新时间:2023-11-30 15:05:10 29 4
gpt4 key购买 nike

我正在尝试使用 Python 3.5 C API执行一些包括构造类的代码。具体来说是这样的:

class MyClass:
def test(self):
print('test')

MyClass().test()

我遇到的问题是它会出现这样的错误:

Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: __build_class__ not found

所以不知何故,我需要我的模块包含 __build_class__,但我不确定如何(我想我也会错过使用 Python 时默认获得的其他东西) - 是否存在一种将所有这些内置内容包含在我的模块中的方法?

这是迄今为止我的代码:

#include <Python.h>

int main(void)
{
int ret = 0;
PyObject *pValue, *pModule, *pGlobal, *pLocal;

Py_Initialize();

pGlobal = PyDict_New();
pModule = PyModule_New("mymod");
pLocal = PyModule_GetDict(pModule);

pValue = PyRun_String(
"class MyClass:\n\tdef test(self):\n\t\tprint('test')\n\nMyClass().test()",
Py_file_input,
pGlobal,
pLocal);

if (pValue == NULL) {
if (PyErr_Occurred()) {
PyErr_Print();
}
ret = 1;
} else {
Py_DECREF(pValue);
}

Py_Finalize();

return ret;
}

所以pValueNULL并且它正在调用PyErr_Print

最佳答案

他们(至少)有两种方法来解决这个问题......

方式 1

而不是:

pGlobal = PyDict_New();

您可以导入 __main__ 模块并获取它的全局字典,如下所示:

pGlobal = PyModule_GetDict(PyImport_AddModule("__main__"));

这种方式的描述如下:

BUT PyEval_GetGlobals will return null it it is not called from within Python. This will never be the case when extending Python, but when Python is embedded, it may happen. This is because PyRun_* define the global scope, so if you're not somehow inside a PyRun_ thing (e.g. module called from python called from embedder), there are no globals.

In an embedded-python situation, if you decide that all of your PyRun_* calls are going to use __main__ as the global namespace, PyModule_GetDict(PyImport_AddModule("__main__")) will do it.

这是我从问题 embedding 中得到的我发现了这个Python list .

方式 2

或者作为替代方案,我个人更喜欢导入主模块(并发现 here ),您可以执行此操作以使用内置内容填充您创建的新字典,其中包括 __build_class__:

pGlobal = PyDict_New();
PyDict_SetItemString(pGlobal, "__builtins__", PyEval_GetBuiltins());

关于python - 在 python C API 中创建模块时如何包含 __build_class__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994010/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com