2011-10-11 59 views
8

我想了解Python C-Api是如何工作的,我想在Python和C擴展之間交換numpy數組。Numpy C-Api示例給出了一個SegFault

於是,我開始本教程:http://dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html

試圖做第一個例子那裏,計算2D numpy的陣列的跟蹤C模塊中,對我來說是很整齊,因爲我想要做的基本操作也在二維數組中。

#include <Python.h> 
#include "Numeric/arrayobject.h" 
#include<stdio.h> 

int main(){ 
Py_Initialize(); 
import_array(); 
} 

static char doc[] = 
"This is the C extension for xor_masking routine"; 

    static PyObject * 
    trace(PyObject *self, PyObject *args) 
    { 
    PyObject *input; 
    PyArrayObject *array; 
    double sum; 
    int i, n; 

    if (!PyArg_ParseTuple(args, "O", &input)) 
    return NULL; 
    array = (PyArrayObject *) 
    PyArray_ContiguousFromObject(input, PyArray_DOUBLE, 2, 2); 
    if (array == NULL) 
    return NULL; 

    n = array->dimensions[0]; 
    if (n > array->dimensions[1]) 
    n = array->dimensions[1]; 
    sum = 0.; 
    for (i = 0; i < n; i++) 
    sum += *(double *)(array->data + i*array->strides[0] + i*array->strides[1]); 
    Py_DECREF(array); 
    return PyFloat_FromDouble(sum); 
    } 

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

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


} 

該模塊的名稱是跟蹤,並與setup.py文件編譯:

from distutils.core import setup, Extension 

module = Extension('trace', sources = ['xor_masking.cpp']) 
setup(name = 'Trace Test', version = '1.0', ext_modules = [module]) 

該文件編譯,trace.so在IPython的是進口的,但是當我嘗試使用方法trace(),我得到一個Segmentation Fault,我不知道爲什麼。

我在Fedora 15的Python 2.7.1,GCC 4.3.0運行此,numpy的1.5.1

+0

請注意,您所遵循的教程是* Numeric *,舊庫被當前Numpy取代。 Numpy *主要*後向兼容,但不完全。 (是的,也*數字*被非正式稱爲「numpy的」,這種狀況導致混亂...) –

+0

然後,我應該導入 '#包括「與NumPy/arrayobject.h' 呢? –

回答

15

的模塊你init函數需要調用

import_array(); 

(void) Py_InitModule("trace", TraceMethods); 

它在教程附近的頂部提到了這一點,但很容易錯過。沒有這個,它會在PyArray_ContiguousFromObject上發生段錯誤。

+0

非常感謝!是的,我很難理解初始化 它就像一個魅力 –

+0

哇,我正在打破我的頭! –

相關問題