如何在 Python C API 中的内存视图上调用释放
How to call release on a memoryview in Python C API
我有一个现有的 PyMemoryViewObject
,我想 "release" 使 memoryview
对象无效。
我可以通过 PyObject_CallMethod
API:
调用 release
函数
if (PyMemoryView_Check(obj)) {
PyObject_CallMethod(obj, "release", NULL);
}
这很好用,但我想使用更直接的方法。
我试过这个:
if (PyMemoryView_Check(obj)) {
PyBuffer_Release(PyMemoryView_GET_BUFFER(obj));
}
但是,这不起作用,我仍然能够从 Python 中的缓冲区 read/write。事实上,PyBuffer_Release
的文档说:
/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */
没有 C API 要求。你必须通过一个方法调用。 (您可能希望从 C 调用的许多方法都是这种情况。)
不要试图在内存视图的底层 Py_buffer
上调用 PyBuffer_Release
。内存视图负责执行此操作,并跟踪它是否已完成。如果您尝试自己释放缓冲区,内存视图将处于不一致状态,仍然认为它拥有一个有效的缓冲区,事情就会崩溃。
我有一个现有的 PyMemoryViewObject
,我想 "release" 使 memoryview
对象无效。
我可以通过 PyObject_CallMethod
API:
release
函数
if (PyMemoryView_Check(obj)) {
PyObject_CallMethod(obj, "release", NULL);
}
这很好用,但我想使用更直接的方法。
我试过这个:
if (PyMemoryView_Check(obj)) {
PyBuffer_Release(PyMemoryView_GET_BUFFER(obj));
}
但是,这不起作用,我仍然能够从 Python 中的缓冲区 read/write。事实上,PyBuffer_Release
的文档说:
/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */
没有 C API 要求。你必须通过一个方法调用。 (您可能希望从 C 调用的许多方法都是这种情况。)
不要试图在内存视图的底层 Py_buffer
上调用 PyBuffer_Release
。内存视图负责执行此操作,并跟踪它是否已完成。如果您尝试自己释放缓冲区,内存视图将处于不一致状态,仍然认为它拥有一个有效的缓冲区,事情就会崩溃。