我用 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(使用前将#替换为@)