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

标签 c++ python-3.x numpy

我正在尝试在 Windows 上使用 C++ 扩展 Python 3.6,遵循 the official documentationguide . Anaconda 发行版与更新到最新版本的 numpy 一起使用。在项目中,python.harrayobject.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/

相关文章:

c++ - 如何在 C++ 中检查字符串数组是否有换行符?

python - 使用线程时 Pyqt5 GUI 仍然挂起

python - Numpy 数组按值传递

python - reshape (60000, 28, 28, 1) 是什么意思?

c++ - 当我运行C++程序时,它返回某种数字

c++ - C++ 中的 Bittorrent 客户端,连接到非阻塞套接字上的对等点总是超时

python .format(*str) 返回 5348 而不是 50

python-3.x - Pandas 格式列作为货币

python - 在不知道形状的情况下加载 np.memmap

c++ - 如何在我自己的staticLib中使用staticLib?