Ядро сбрасывается при передаче двойного массива из C в Python с использованием модуля расширения C для Python - PullRequest
0 голосов
/ 02 сентября 2018

Я пишу простой код на c, который вернет двойной массив в python. Я успешно скомпилировал код без ошибок и могу сгенерировать файл .so для импорта в python. Однако, когда я вызываю упакованную функцию C из среды Python, я получаю 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);
 }
}
...