【问题标题】:Numpy C-Api example gives a SegFaultNumpy C-Api 示例给出了 SegFault
【发布时间】:2011-10-11 18:30:38
【问题描述】:

我正在尝试了解 Python C-Api 的工作原理,并且我想在 Python 和 C 扩展之间交换 numpy 数组。

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

尝试在那里做第一个例子,一个计算二维 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);
}


}

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

文件编译完成,在IPython中导入了trace.so,但是当我尝试使用trace()方法时,我得到一个Segmentation Fault,我不知道为什么。

我使用 Fedora 15、Python 2.7.1、gcc 4.3.0、Numpy 1.5.1 运行它

【问题讨论】:

  • 请注意,您所遵循的教程是针对 Numeric 的,它是被当前 Numpy 取代的旧库。 Numpy 大部分向后兼容,但不完全兼容。 (是的,Numeric 也被非正式地称为“Numpy”,这会导致混淆......)
  • 那么,我应该导入#include "Numpy/arrayobject.h吗?

标签: python c numpy python-c-api


【解决方案1】:

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

import_array();

之后

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

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

【讨论】:

  • 非常感谢!是的,我很难理解初始化。它就像一个魅力。
  • 哇。我为此头破血流!谢谢
  • 对于较新的版本:在Py_Initialize();之前添加import_array();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多