使用python的c扩展模块将双数组从C传递到python时转储核心

时间:2018-09-02 06:17:14

标签: python c wrapper ctypes numpy-ndarray

我正在编写一个简单的C代码,它将返回一个double数组给python。我成功编译了代码,没有错误,并且可以生成.so文件以导入python。但是,当我从Python环境调用包装的C函数时,会得到core dump。我在下面附加了c代码,以便可以重现该错误。如果有人指示我指出我要去哪里错误而导致core dump错误,我将非常有义务。调试时,我发现错误的来源在行中

pyArr = (PyArrayObject*) PyArray_SimpleNewFromData(2, dims, NPY_DOUBLE, ptr);

但是我无法解决此问题。我还在static double array中尝试了line 6,但遇到了同样的core dump问题。任何帮助表示赞赏。

#include <Python.h>
#include <numpy/arrayobject.h>
#include <numpy/ndarrayobject.h>

extern "C" {
    static PyObject* func_wrap(PyObject* , PyObject* args)
    {
    double* ptr;
    ptr = (double *) malloc(4 * sizeof(double));
    *ptr = 1.0; *(ptr+1) = 2.0; *(ptr+2) = 3.0; *(ptr+3) = 4.0;
    PyArrayObject* pyArr;
    npy_intp dims[1];
    dims[0] = 4;
    pyArr = (PyArrayObject*)PyArray_SimpleNewFromData(1, dims, NPY_BYTE, ptr);
    PyArray_ENABLEFLAGS(pyArr, NPY_ARRAY_OWNDATA);  /* numpy array takes the ownership afterwards */
    return Py_BuildValue("O", pyArr);
 }

 static PyMethodDef CppMethods[] = {
      {"func", func_wrap, METH_VARARGS, "returns numpy 1d array"},
      {NULL, NULL, 0, NULL}
  };

 // Define module information
 static struct PyModuleDef mydemo = {
 PyModuleDef_HEAD_INIT,
 "mydemo",
 "mydemo Module",
 -1,
 CppMethods
 };

 // Init function for module
 PyMODINIT_FUNC PyInit_mydemo(void) {
     import_array();
     return PyModule_Create(&mydemo);
 }
}

0 个答案:

没有答案