【问题标题】:SystemError: error return without exception setSystemError:没有设置异常的错误返回
【发布时间】:2016-08-27 08:31:56
【问题描述】:

我正在学习如何嵌入 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;
}

程序运行并调用了我的函数,但返回时出现异常:

来自 C 的你好
回溯(最近一次通话最后):
  文件“”,第 2 行,在
SystemError: 没有设置异常的错误返回

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

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

【问题讨论】:

    标签: c++ python-embedding


    【解决方案1】:

    您的函数确实不需要返回任何内容(在这种情况下),但在 Python 中,“不返回任何内容”意味着返回 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2016-04-13
      • 1970-01-01
      • 2018-04-11
      • 2021-04-14
      • 1970-01-01
      相关资源
      最近更新 更多