6

我对使用缓冲区协议在 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.asarrayValueError: 'T{L:width:L:height:&B:pixels:}' is not a valid PEP 3118 buffer format string

考虑到所有这些,我有以下问题:

  1. 标准 python 库中是否有任何模块可以利用完整PEP 3118规范?
  2. 这种结构格式语法是否在任何地方正式定义(即使用 PEG 语法)?
  3. 如果 cython 或 numpy 包含指针,有没有办法强制它自动生成有效的格式字符串?
4

0 回答 0