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

时间:2014-06-20 22:38:43

标签: python-3.x python-c-api python-c-extension

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

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

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

我也查看了memoryview,PyMemoryView_FromMemory()没有复制但是没有办法传递一个回调来释放我的缓冲区。而且我不是suse Python lib(例如Psycopg)可以使用或不使用memoryview对象。

我是否必须创建自己的对象才能达到这两个要求?还有其他快捷方式吗?

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

感谢。

1 个答案:

答案 0 :(得分:0)

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