2011-10-13 110 views
2

我正在編寫一個代碼,試圖習慣NumPy數組的C API。PyArg_ParseTuple在CApi中的SegFaults

#include <Python.h> 
#include "numpy/arrayobject.h" 
#include <stdio.h> 
#include <stdbool.h> 


static char doc[] = 
"Document"; 

static PyArrayObject * 
    trace(PyObject *self, PyObject *args){ 

    PyArrayObject *matin; 

    if (!PyArg_ParseTuple(args, "O!",&PyArray_Type, &matin)) 
     return NULL; 

    printf("a"); 
    return matin; 
} 

static PyMethodDef TraceMethods[] = { 
    {"trace", trace, METH_VARARGS, doc}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC 
inittrace(void) 
{ 
    (void) Py_InitModule("trace", TraceMethods); 
    import_array(); 
} 

這是一個精簡版本。我只想要能夠獲得類型爲PyArrayObject的對象並將其返回。不幸的是,這也給了SegFault。

Linux中,64位,的Python 2.7.1

回答

1

the docs

O(對象)[的PyObject *]
商店Python對象(沒有任何轉換)在C對象指針。 C程序因此接收傳遞的實際對象。 對象的引用計數沒有增加。存儲的指針不是NULL

O!(對象)[typeobject,的PyObject *]
存放在C對象指針Python對象。這與O類似,但是...

您正在返回一個被盜的參考。首先增加它。

+0

我不熟悉C語言的軟件架構,但是我猜想當我不用'PYINCREF(the_python_object)增加引用時,'然後垃圾收集器發現它的引用是0,並釋放內存。 (糾正我,如果我錯了) –

+0

本質上是的,但它的引用計數下降到0,調用GC而不是其他方式。 –