Я пытаюсь расширить 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();
, похоже, вызывает сбой, так как без него ядро не падает. Однако, как отмечается в документации, метод завершается сбоем. Что за исправление?