【问题标题】:Segmentation fault creating PyArrayObject using PyArray_SimpleNew使用 PyArray_SimpleNew 创建 PyArrayObject 的分段错误
【发布时间】:2020-04-16 20:24:32
【问题描述】:

我正在为 numpy 创建一个 C 扩展。该函数应该返回一个数组,所以我决定使用 PyArray_SimpleNew 创建一个尺寸为 50x10 的 PyArrayObject,然后用一些值填充它。代码如下:

PyArrayObject *a; npy_intp dims[2];
dims[0] = 50; dims[1] = 10;
a = (PyArrayObject *) PyArray_SimpleNew(2, dims, NPY_DOUBLE); 

但是,在第三行创建数组 a 会产生 Segmentation Fault。知道可能是什么问题吗?

【问题讨论】:

  • 也许creating numpy array in c extension segfaults 有帮助,你打电话给import_array() 了吗?
  • 哦,谢谢。我刚刚发布了一个解决方案,因为我之前没有检查您的评论。无论如何,它确实解决了问题。现在的问题是为什么?
  • "void import_array(void):必须在将使用 C-API 的模块的初始化部分调用此函数。它导入存储函数指针表的模块,并将正确的变量指向它。”从 NumPy C-API 文档文本复制。

标签: numpy c-api


【解决方案1】:

我需要在我的初始化函数中包含 import_array(),如下所示。我不知道 import_array() 做了什么,但解决了这个问题。

PyMODINIT_FUNC
PyInit_multpy(void)
{
    import_array();
    return PyModule_Create(&multpymodule);
}

PS:很高兴知道为什么必须在 PyMODINIT_FUNC 中调用 import_array()。如果有人知道,请解释一下。

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2017-03-17
    • 1970-01-01
    • 2014-11-24
    • 2014-04-10
    相关资源
    最近更新 更多