在 Numpy 数组上调用 PyArg_ParseTuple 时崩溃

2024-01-18

我用 C 语言编写了一个简单的 Python 扩展函数,它只读取 Numpy 数组,然后就崩溃了。

static PyObject *test(PyObject *self, PyObject *args)
{
    PyArrayObject *array = NULL;

    if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &array)) // Crash
        return NULL;

    return Py_BuildValue("d", 0);
}

它的名字如下:

l = np.array([1,2,3,1,2,2,1,3])

print("%d" % extension.test(l))

我的代码有什么问题吗?


我认为错误出在您的示例中未包含的代码中:您是否记得调用import_array()在你的模块初始化函数中:

...此子例程还必须包含对 import_array() 和/或 import_ufunc() 的调用,具体取决于需要哪个 C-API。一旦实际调用任何 C-API 子例程,忘记放置这些命令就会显示为丑陋的分段错误(崩溃)。

http://docs.scipy.org/doc/numpy-1.10.1/user/c-info.how-to-extend.html#required-subroutine http://docs.scipy.org/doc/numpy-1.10.1/user/c-info.how-to-extend.html#required-subroutine

我逐字复制了你的示例并添加了(使用 python 3)

PyMODINIT_FUNC
PyInit_numpytest(void)
{
    import_array();
    return PyModule_Create(&numpytest);
}

该示例运行没有问题。另一方面,删除调用会导致崩溃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Numpy 数组上调用 PyArg_ParseTuple 时崩溃 的相关文章

随机推荐