gpt4 book ai didi

python - 使用 CFFI 的缓冲协议(protocol)

转载 作者:行者123 更新时间:2023-11-30 18:38:44 25 4
gpt4 key购买 nike

我想公开一个对象的缓冲区协议(protocol),就像in this example Cython 文档,但是我需要使用 CFFI 来执行此操作而且我找不到任何公开缓冲区协议(protocol)的示例。

最佳答案

我对这个问题的理解是,您从 CFFI 接口(interface)获得了一些数据,并希望使用标准 Python 缓冲区协议(protocol)(许多 C 扩展使用该协议(protocol)来快速访问数组数据)公开它。

好消息 ffi.buffer() 命令(公平地说,直到 OP 提到它我才知道!)公开了 Python 接口(interface)和 C-API 侧缓冲区协议(protocol)。但它仅限于将数据视为无符号字符/字节数组。幸运的是,使用其他 Python 对象(例如,可以将其视为其他类型)。

帖子的其余部分是一个说明性示例:

# buf_test.pyx
# This is just using Cython to define a couple of functions that expect
# objects with the buffer protocol of different types, as an easy way
# to prove it works. Cython isn't needed to use ffi.buffer()!
def test_uchar(unsigned char[:] contents):
print(contents.shape[0])
for i in range(contents.shape[0]):
contents[i]=b'a'

def test_double(double[:] contents):
print(contents.shape[0])
for i in range(contents.shape[0]):
contents[i]=1.0

...以及使用 cffi 的 Python 文件

import cffi
ffi = cffi.FFI()

data = ffi.buffer(ffi.new("double[20]")) # allocate some space to store data
# alternatively, this could have been returned by a function wrapped
# using ffi

# now use the Cython file to test the buffer interface
import pyximport; pyximport.install()
import buf_test

# next line DOESN'T WORK - complains about the data type of the buffer
# buf_test.test_double(obj.data)

buf_test.test_uchar(obj.data) # works fine - but interprets as unsigned char

# we can also use casts and the Python
# standard memoryview object to get it as a double array
buf_test.test_double(memoryview(obj.data).cast('d'))

关于python - 使用 CFFI 的缓冲协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32852863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com