Numpy C-Api示例导致SegFault问题

9
我正在尝试理解Python C-API的工作原理,并希望在Python和C扩展之间交换numpy数组。
因此,我开始学习这个教程:http://dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html 我尝试了那里的第一个示例,一个计算2D numpy数组迹的C模块,对我来说非常有用,因为我也想在2D数组中进行基本操作。
#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])

文件已编译,trace.so已在IPython中导入,但是当我尝试使用方法trace()时,出现了Segmentation Fault错误,我不知道原因。
我使用Fedora 15、Python 2.7.1、gcc 4.3.0、Numpy 1.5.1运行此代码。

请注意,您正在使用的教程是针对旧库Numeric而非当前的Numpy。Numpy在很大程度上向后兼容Numeric,但并非完全兼容。(是的,“Numeric”也被非正式地称为“Numpy”,这会导致混淆……) - pv.
那么,我应该导入#include "Numpy/arrayobject.h"吗? - mehmet.ali.anil
1个回答

17

你的模块初始化函数需要调用

import_array();

之后

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

教程顶部提到了这一点,但很容易被忽略。 没有它,在PyArray_ContiguousFromObject上会导致段错误。


非常感谢!是的,我在理解初始化方面遇到了困难。 现在它运行得非常好。 - mehmet.ali.anil
哇,我为这个问题苦恼了很久!谢谢。 - Raghav RV
对于较新的版本:在 Py_Initialize(); 之前添加 import_array(); - Rugnar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接