Расширяя Python / Numpy с помощью C ++, происходит сбой модуля при инициализации - PullRequest
1 голос
/ 05 мая 2019

Я пытаюсь расширить Python 3.6, используя C ++ для Windows, следуя официальной документации и , руководство . Дистрибутив Anaconda используется с NumPy, обновленной до последней версии. В проекте python.h и arrayobject.h были добавлены в каталоги C ++ и python36.lib связаны, как рекомендовано.

Для кода, простой пример, который должен создать массив с элементами 0,1,2,3 при вызове метода func1:

#include <python.h>
#include <arrayobject.h> 

static PyObject* fun(PyObject* self, PyObject* args)
{
    PyObject *X;
    int x[4] = {0,1,2,3};
    int dims[1];
    dims[0] = 1;
    X = PyArray_SimpleNew(1, dims, NPY_INT64, x);

    return X;
}

static PyMethodDef MyMethod[] = {
    { "func1", fun, METH_VARARGS,nullptr },
    { nullptr, nullptr, 0, nullptr } 
};

static struct PyModuleDef MyModule = {
    PyModuleDef_HEAD_INIT,
    "MyModule", 
    NULL, 
    -1,      
    MyMethod
};

PyMODINIT_FUNC PyInit_MyModule(void)
{
    (void)PyModule_Create(&MyModule);
    import_array();
}

Код строится нормально. Когда я беру полученный .pyd файл и импортирую его в Spyder, ядро ​​вылетает. В частности, команда import_array();, похоже, вызывает сбой, так как без него ядро ​​не падает. Однако, как отмечается в документации, метод завершается сбоем. Что за исправление?

1 Ответ

1 голос
/ 05 мая 2019

Это было решено путем изменения порядка:

    PyMODINIT_FUNC PyInit_MyModule(void)
    {
        import_array();
        return PyModule_Create(&MyModule);            
    }

Кажется, что вся документация касается только Python 2.X, который использовал другую инициализацию .В Python 3 код необходимо изменить.(Существует также небольшая ошибка при создании массива, но я позволю этому быть).

...