Разбор строк формата протокола буфера 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
,
Учитывая все это, у меня есть следующие вопросы:
- Есть ли какой-либо модуль в стандартной библиотеке Python, который использует преимущества полного
PEP 3118
Спецификация? - Этот синтаксис формата структуры определен формально где-нибудь (то есть с грамматикой PEG)?
- Есть ли способ заставить Cython или NumPy автоматически генерировать правильную строку формата, если она содержит указатели?