Разбор строк формата протокола буфера PEP 3118

Я заинтересован в передаче двоичных данных между python, numpy и cython, используя буферный протокол. Глядя на PEP 3118, кажется, что есть некоторые дополнения к синтаксису struct string, которые добавляют поддержку для полезных функций, таких как именованные поля и вложенные структуры.

Однако представляется, что поддержка всего диапазона синтаксиса буфера ограничена во всех этих трех местах. Например, скажем, у меня есть следующая структура 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 используя мою собственную строку или используя питона struct модуля calcsize Функция выдаст предупреждение как struct.error: bad char in struct format,

Я могу вручную создать и заполнить Py_buffer объект, как описано здесь, но пытается преобразовать его в массив с np.asarray доходность 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 ответов

Другие вопросы по тегам