【发布时间】:2017-02-20 23:37:39
【问题描述】:
我正在尝试使用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;
}
所以pValue 是NULL,它正在调用PyErr_Print。
【问题讨论】:
-
我认为您需要将解释器全局变量而不是空字典传递给它。但我不知道该怎么做。
-
谢谢,遗憾的是 PyEval_GetGlobals();返回 null (我从调用中得到 SystemError: PyEval_EvalCodeEx: NULL globals)。我是否需要导入 main 模块或类似的东西?
-
啊,感谢您的提示,我开始寻找 GetGlobals 返回 null 并发现:gossamer-threads.com/lists/python/python/8946#8946 - 似乎我需要执行 pGlobal = PyModule_GetDict(PyImport_AddModule("main ")); (而不是 pGlobal = PyDict_New())然后它就可以工作了。 (主要有下划线,不是粗体)谢谢!
-
很高兴为您指明了正确的方向。 (我不确定我自己是否会得到有用的答案)。顺便说一句,您可以将代码放在带有反引号(`)的cmets中
标签: python c python-3.x python-c-api