バッファ プロトコルを使用して、python、numpy、および cython の間でバイナリ データを渡すことに興味があります。PEP 3118を見ると、名前付きフィールドやネストされた構造体などの便利な機能のサポートを追加する、構造体の文字列構文にいくつかの追加があるようです。
ただし、バッファ構文の全範囲のサポートは、これら 3 つの場所すべてで制限されているようです。たとえば、次の 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
herePy_buffer
で説明されているように、手動でオブジェクトを作成して埋めることができますが、これをyieldsで numpy 配列に変換しようとしています。np.asarray
ValueError: 'T{L:width:L:height:&B:pixels:}' is not a valid PEP 3118 buffer format string
これらすべてを念頭に置いて、次の質問があります。
PEP 3118
完全な仕様を利用する標準の python ライブラリにモジュールはありますか?- この構造体形式の構文は、どこかで正式に定義されていますか (つまり、PEG 文法を使用して)?
- ポインターが含まれている場合、cython または numpy に有効なフォーマット文字列を自動的に生成させる方法はありますか?