解析PEP 3118缓冲区协议格式字符串

时间:2019-05-04 00:29:10

标签: python-3.x numpy buffer cython pep3118

我对使用缓冲协议在python,numpy和cython之间传递二进制数据感兴趣。观察PEP 3118,似乎在结构字符串语法中增加了一些功能,从而增加了对诸如命名字段和嵌套结构等有用功能的支持。

但是,在这三个地方,似乎对缓冲区语法的所有范围的支持都受到限制。例如,假设我具有以下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 因为如果类型化的内存视图包含指针,则无法创建它们。

类似地,使用我的自定义字符串或使用python view.array模块的struct函数创建calcsize时会发出类似struct.error: bad char in struct format的警告。

我可以按照here的描述手动创建和填充Py_buffer对象,但是尝试将其转换为具有np.asarray的numpy数组会产生ValueError: '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如果包含指针,则自动生成有效的格式字符串?

0 个答案:

没有答案