【问题标题】:python c-api: create bytes using existing buffer without copyingpython c-api:使用现有缓冲区创建字节而不复制
【发布时间】:2014-06-20 22:38:43
【问题描述】:

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

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

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

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

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 能否请您解释一下如何做到这一点,最好使用代码示例?
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 2012-07-17
    • 2015-08-25
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多