python c-api:使用现有缓冲区创建字节而不复制

use*_*759 7 python-c-api python-c-extension python-3.x

在我看来,缓冲区协议更像是将 Python 缓冲区暴露给 C。

我找不到使用现有缓冲区创建字节对象的方法,而无需在 C 中进行复制。

基本上我想要的是实现类似于 PyBytes_FromStringAndSize() 但不复制的东西,并在对象被释放时使用回调来释放缓冲区。在收到从 C API 返回的缓冲区之前,我不知道缓冲区有多大。所以先在 Python 中创建 bytes 对象然后再填充它不是一种选择。

我还查看了 memoryview,PyMemoryView_FromMemory() 不会复制,但无法通过回调来释放我的缓冲区。而且我不是 suse Python lib(例如 Psycopg)是否可以使用 memoryview 对象。

我是否必须创建自己的对象才能实现这两个要求?还有什么捷径吗?

如果必须,我如何确保这个对象与字节一样工作,以便我可以安全地将它传递给 Python lib?

谢谢。

use*_*759 1

执行此操作的唯一方法是使用 PyBufferProcs* PyTypeObject.tp_as_buffer 创建一个新对象。我彻底检查了 cpython 源代码,从 3.4.1 开始,没有现成的(可以这么说)解决方案。