我对使用缓冲区协议在 python、numpy 和 cython 之间传递二进制数据感兴趣。查看PEP 3118,似乎对 struct string-syntax 进行了一些添加,增加了对命名字段和嵌套结构等有用功能的支持。
但是,似乎在所有这三个地方对所有缓冲区语法的支持都是有限的。例如,假设我有以下 cython 结构:
ctypedef packed struct ImageComp:
uint32_t width
uint32_t height
uint8_t *pixels
#Here is the appropriate struct format string representation
IMAGE_FORMAT = b'T{L:width:L:height:&B:pixels:}'
尝试提取符合 PEP-3118 的字节字符串,如下所示
cdef void *image_temp = malloc(sizeof(ImageComp))
IMAGE_SIZE = sizeof(ImageComp)
IMAGE_FORMAT = (<ImageComp[:1]>image_temp)._format
IMAGE_DTYPE = np.asarray(<ImageComp[:1]>image_temp).dtype
free(image_temp)
失败并显示此错误消息:
Invalid base type for memoryview slice: ImageComp
因为如果它们包含指针,则无法创建类型化的内存视图。
同样,view.array
使用我的自定义字符串或使用 pythonstruct
模块的calcsize
函数创建一个类似的警告struct.error: bad char in struct format
。
我可以按照此处所述手动创建和填充Py_buffer
对象,但尝试将其转换为具有产量的 numpy 数组。np.asarray
ValueError: 'T{L:width:L:height:&B:pixels:}' is not a valid PEP 3118 buffer format string
考虑到所有这些,我有以下问题:
- 标准 python 库中是否有任何模块可以利用完整
PEP 3118
规范? - 这种结构格式语法是否在任何地方正式定义(即使用 PEG 语法)?
- 如果 cython 或 numpy 包含指针,有没有办法强制它自动生成有效的格式字符串?