在c扩展中返回numpy数组会导致分段错误:11

时间:2020-05-13 11:42:51

标签: python c numpy python-c-api

我正在尝试为python编写ac扩展,以加快我在项目中执行的数字运算,而不必将整个过程移植到C。不幸的是,当我尝试使用扩展功能返回numpy数组时在python中,它会导致分段错误11。这是下面的一个最小示例。

#include "Python.h"
#include "numpy/arrayobject.h"
#include <math.h>

static PyObject *myFunc(PyObject *self, PyObject *args)
{
    PyArrayObject *out_array;
    int dims[1];
    dims[0] = 2;
    out_array = (PyArrayObject *) PyArray_FromDims(1,dims,NPY_DOUBLE);

    // return Py_BuildValue("i", 1); // if I swap this return value it works
    return PyArray_Return(out_array);
}

static PyMethodDef minExMethiods[] = {
    {"myFunc", myFunc, METH_VARARGS},
    {NULL, NULL}     /* Sentinel - marks the end of this structure */
};

static struct PyModuleDef minExModule = {
    PyModuleDef_HEAD_INIT,
    "minEx",   /* name of module */
    NULL, /* module documentation, may be NULL */
    -1,       /* size of per-interpreter state of the module,
                 or -1 if the module keeps state in global variables. */
    minExMethiods
};

PyMODINIT_FUNC PyInit_minEx(void)
{   
    return PyModule_Create(&minExModule);
}

有人可以建议我做错了什么吗?我在OS X 10.13.6上的python 3.6环境中使用了conda

谢谢

1 个答案:

答案 0 :(得分:0)

在这里很好地展示了我的经验,但希望对其他人有用。 我需要打电话。模块初始化函数中的import_array()可以正确使用numpy的c帮助函数。然后,我还得到了PyArray_FromDims被贬值的错误。固定代码如下。

#include "Python.h"
#include "numpy/arrayobject.h"
#include <math.h>

static PyObject *myFunc(PyObject *self, PyObject *args)
{
    PyArrayObject *out_array;
    npy_intp dims[1];
    dims[0] = 2;
    out_array = (PyArrayObject *) PyArray_SimpleNew(1,dims,PyArray_DOUBLE);
    return PyArray_Return(out_array);
}

static PyMethodDef minExMethiods[] = {
    {"myFunc", myFunc, METH_VARARGS},
    {NULL, NULL}     /* Sentinel - marks the end of this structure */
};

static struct PyModuleDef minExModule = {
    PyModuleDef_HEAD_INIT,
    "minEx",   /* name of module */
    NULL, /* module documentation, may be NULL */
    -1,       /* size of per-interpreter state of the module,
                 or -1 if the module keeps state in global variables. */
    minExMethiods
};

PyMODINIT_FUNC PyInit_minEx(void)
{   
    PyObject *module = PyModule_Create(&minExModule);
    import_array();
    return module;
}