SystemError:没有异常设置的错误返回

时间:2016-08-27 08:31:57

标签: c++ python-embedding

我正在学习嵌入Python,在我的测试程序中,我从我的C应用程序调用Python代码,然后Python代码调用我提供的方法:

#include <Python.h>

// The callback function.
extern "C" PyObject * printHello(PyObject *self, PyObject *args) {
    printf("hello from C\n");
    return 0;
}

PyMethodDef methods [] = {
    { "printHello", printHello, METH_NOARGS, "docs docs docs" },
    { 0, 0, 0, 0 },
};

int main(int argc, char *argv[])
{
    Py_Initialize();
    Py_InitModule("emb", methods);
    PyRun_SimpleString(
                "import emb\n"
                "emb.printHello()\n"
                );
    Py_Finalize();
    return 0;
}

程序运行并且我的函数被调用,但是在返回时我得到一个例外:

hello from C
Traceback (most recent call last):
  File "", line 2, in 
SystemError: error return without exception set

我认为这与调用约定或我的回调函数的签名有关。

特别是,因为我回来了0?我的函数不需要返回任何内容,这就是我返回0的原因。我会使用void printHello(),但PyCFunction要求签名为PyObject * func(PyObject *self, PyObject *args);

1 个答案:

答案 0 :(得分:1)

你纠正了你的功能并不真正需要返回任何东西(在这种情况下),但是,在Python中,&#34;没有返回任何东西&#34;表示返回None。尝试替换

return 0;
使用

printHello函数中

Py_INCREF(Py_None);
return Py_None;

第一行递增None的引用计数,第二行返回它。

更好的是,只需使用Py_RETURN_NONE(这是相同的简写):

extern "C" PyObject * printHello(PyObject *self, PyObject *args) {
    printf("hello from C\n");
    Py_RETURN_NONE;
}