我正在尝试在 Windows 上使用 C++ 扩展 Python 3.6,遵循 the official documentation和 guide . Anaconda 发行版与更新到最新版本的 numpy 一起使用。在项目中,python.h
和 arrayobject.h
已添加到 C++ 目录,并按照建议链接了 python36.lib
。
对于代码,一个简单的示例,当调用 func1
方法时,应该创建一个包含元素 0,1,2,3
的数组:
#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();
命令似乎会导致崩溃,因为没有它内核不会崩溃。但是,正如文档所述,该方法随后崩溃。修复方法是什么?
最佳答案
通过改变顺序解决了:
PyMODINIT_FUNC PyInit_MyModule(void)
{
import_array();
return PyModule_Create(&MyModule);
}
所有文档似乎只涉及 Python 2.X,它使用了 different initialization .在 python 3 中,代码需要修改。 (在创建数组时也有一个小错误,但我顺其自然)。
关于c++ - 使用 C++ 扩展 Python/Numpy,模块在初始化时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55987113/