Python - SystemError:在PyObject调用中没有错误的NULL结果

时间:2015-03-15 08:30:20

标签: python c arrays numpy extending

故事:我试图从C接口到Python,以便为现有的Python代码使用更快的C计算速度。我已经取得了一些成功,也通过了NumPy阵列 - 但现在似乎有一个问题,我无法解决它。这是代码:

#define FORMAT_VALUE_T  "d"
char format_buffer[32];

typedef struct
    {
        PyObject_HEAD
        PyArrayObject *invmat;
        unsigned order;
        value_t weight, *buffer;
    } Det;

    typedef double value_t;

    typedef struct
    {
        PyObject_HEAD
        Det *det;
        value_t *row, *covs, ratio, star;
    } DetAppendMove;

    static int append_init(DetAppendMove *self, PyObject *args, PyObject *kwds)
    {
        value_t star, *temp;
        PyArrayObject *row, *col;
        PyObject *result = Py_BuildValue("(i)",1);
        Det *dete;

        snprintf(format_buffer, sizeof(format_buffer), "%s%s", "O!O!O!", FORMAT_VALUE_T);
        if (PyArg_ParseTuple(args, format_buffer, &DetType, &dete, &PyArray_Type, &row, &PyArray_Type, &col, &star))
        {   
            self->det = dete;
            temp = (value_t*)self->det->buffer;
        }
        else
        {
            result = Py_BuildValue("(i)",-1);
        }
        return result;
    }

到目前为止它还没有真正做任何事情,我只是想检查一下我是否能够通过这些数组。正如标题所示,我收到以下错误消息:

  

SystemError:PyObject调用中没有错误的NULL结果

这很有意思,因为我已经传递了一些数组(以相同的方式做到了......)并且通常这些数组甚至可能是100x100。通常人们抱怨非常大的阵列..

我在64位机器上使用Ubuntu 14.04,Python V2.7.6和Numpy 1.8.2

如果你们中的一个人可以帮助我,那真是太棒了 - 我不知道这里出了什么问题..

编辑:我还没有弄清楚这个问题,但有时它会起作用,有时会因为上面的错误而崩溃。我完全不知道这可能是什么 - 任何人?

1 个答案:

答案 0 :(得分:2)

最近有人在另一篇文章中向我展示了答案:

  

当你从暴露给python的c函数返回NULL时,你必须设置   之前的错误消息,因为返回NULL意味着错误   发生了。

     

如果发生错误并且您因此返​​回NULL,那么,   使用PyErr_SetString(),如果没有发生错误,则使用

Py_RETURN_NONE;

谢谢iharob,帮了很多忙!

L,