Numpy C-Api的例子给出了一个SegFault



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

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

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

#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);
}

}

模块名称为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])

文件被编译,跟踪。所以在ippython中被导入,但是当我尝试使用trace()方法时,我得到了一个分段错误,我不知道为什么。

我在Fedora 15, Python 2.7.1, gcc 4.3.0, Numpy 1.5.1下运行这个

模块的init函数需要调用

import_array();

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

它在教程的顶部附近提到了这一点,但是很容易忽略。如果没有这一点,它会在PyArray_ContiguousFromObject上出现分段错误。

最新更新