使用C ++扩展Python / Numpy,模块在初始化时崩溃

时间:2019-05-04 21:54:14

标签: c++ python-3.x numpy

我正尝试在the official documentationguide之后在Windows上使用C ++扩展Python 3.6。使用Anaconda发行版,并将numpy更新到最新版本。根据建议,在项目python.harrayobject.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 个答案:

答案 0 :(得分:1)

已通过更改顺序来解决:

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

所有文档似乎仅涉及使用different initialization的Python2.X。在python 3中,需要修改代码。 (在创建数组时也有一个小错误,但我同意了。)