2016-06-21 64 views
2

我在C中編寫了一個簡單的Python擴展函數,它只是讀取一個Numpy數組並且崩潰。在Numpy數組上調用PyArg_ParseTuple時發生崩潰

static PyObject *test(PyObject *self, PyObject *args) 
{ 
    PyArrayObject *array = NULL; 

    if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &array)) // Crash 
     return NULL; 

    return Py_BuildValue("d", 0); 
} 

這裏是它是如何叫:

l = np.array([1,2,3,1,2,2,1,3]) 

print("%d" % extension.test(l)) 

這有什麼錯我的代碼?

回答

3

我認爲錯誤是你沒有在你的例子包括代碼:你記起了給import_array()在你的模塊初始化函數:

...這個子程序也必須包含調用import_array( )和/或import_ufunc(),這取決於需要哪個C-API。只要實際調用任何C-API子程序,忘記放置這些命令就會顯示爲一個醜陋的分段錯誤(崩潰)。

http://docs.scipy.org/doc/numpy-1.10.1/user/c-info.how-to-extend.html#required-subroutine

我逐字複製你的榜樣,並添加(使用python 3)

PyMODINIT_FUNC 
PyInit_numpytest(void) 
{ 
    import_array(); 
    return PyModule_Create(&numpytest); 
} 

和示例運行沒有問題。另一方面取消呼叫會導致崩潰。

+0

謝謝,它不會崩潰了!我讀過的大多數教程都沒有提供此指令。 –

相關問題