Numpy C-Api示例给出了SegFault

我试图理解Python C-Api是如何工作的,我想在Python和C扩展之间交换numpy数组。

所以,我开始了这个教程: http : //dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html

试图在那里做第一个例子,计算2d numpy数组的跟踪的C模块对我来说非常整洁,因为我也想在2d数组中进行基本操作。

#include  #include "Numeric/arrayobject.h" #include 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 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); } } 

模块的名称是trace,它是使用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运行它

您的模块的init函数需要调用

 import_array(); 

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

它在顶部附近的教程中提到了这一点,但很容易错过。 没有它,它会在PyArray_ContiguousFromObject上发生段PyArray_ContiguousFromObject