El ejemplo de Numpy C-Api da un SegFault

Estoy tratando de entender cómo funciona Python C-Api, y quiero intercambiar arrays numpy entre Python y una extensión C

Entonces, comencé este tutorial: http://dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html

Intenté hacer el primer ejemplo allí, un módulo C que calcula la traza de una matriz numpy 2d, fue muy bueno para mí, ya que también quiero hacer operaciones elementales en matrices 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); } } 

El nombre del módulo es trace, y se comstack con el archivo 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]) 

El archivo está comstackdo, trace.so se importa en IPython, pero cuando bash usar el método trace (), obtengo un error de segmentación, no sé por qué.

Corro esto con Fedora 15, Python 2.7.1, gcc 4.3.0, Numpy 1.5.1

Su función de inicio para el módulo debe llamar

 import_array(); 

después

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

Menciona esto en el tutorial cerca de la parte superior, pero es fácil pasarlo por alto. Sin esto, se segfaults en PyArray_ContiguousFromObject .