6

バッファ プロトコルを使用して、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を使用して を作成すると、 のような警告が表示されます。structcalcsizestruct.error: bad char in struct format

herePy_bufferで説明されているように、手動でオブジェクトを作成して埋めることができますが、これをyieldsで numpy 配列に変換しようとしています。np.asarrayValueError: 'T{L:width:L:height:&B:pixels:}' is not a valid PEP 3118 buffer format string

これらすべてを念頭に置いて、次の質問があります。

  1. PEP 3118完全な仕様を利用する標準の python ライブラリにモジュールはありますか?
  2. この構造体形式の構文は、どこかで正式に定義されていますか (つまり、PEG 文法を使用して)?
  3. ポインターが含まれている場合、cython または numpy に有効なフォーマット文字列を自動的に生成させる方法はありますか?
4

0 に答える 0