1

編集:元の質問を読み直したところ、言葉遣いが非常に悪く、あいまいで、混乱しすぎてまともな答えが得られないことにすぐに気付きました。それは、昼休みの終わりに急いで質問をしたことで得られるものです. うまくいけば、これはより明確になります:

単純な C 構造を PyBuffer として Python (3.x) に公開しようとしているので、そこから MemoryView を取得できます。公開したい構造は次のようになります。

struct ImageBuffer {
    void* bytes;
    int row_count;
    int bytes_per_row;
};

スクリプト作成者が次のようにデータにアクセスできるようにすることが私の望みです。

img_buffer = img.get_buffer()
img_buffer[1::4] = 255 # Set every Red component to full intensity

残念ながら、これらの構造の C API に関する既存のドキュメントはかなりまばらで、自己矛盾している箇所があり、他の箇所では完全に間違っています (ドキュメントに記載されている関数シグネチャがヘッダー内のものと一致しないなど)。これを公開する最善の方法についてのアイデア。また、コア ライブラリの一部であるべき機能を実現するためにサード パーティのライブラリを含めることは避けたいと思いますが、PyBuffer の機能はまだかなり未熟であり、おそらく NumPy のようなものがより良い選択になるでしょう。

これについて誰かアドバイスはありますか?

4

1 に答える 1

1

拡張タイプがバッファプロトコルをサポートするように実装する一連のメソッドについては、http://docs.python.org/3.1/c-api/typeobj.html#buffer-object-structuresで説明されています。

ドキュメントがかなりラフであることを認識しているので、私が提供できる最善のアドバイスは、公式のPythonソースコードのbytesobject.cやbytearrayobject.cなどのC型によるバッファAPIの既存の実装から始めることです。

ただし、バッファプロトコルでは、引用したような高レベルの表記にアクセスできないことに注意してくださいimg_buffer[1::4] = 255。memoryviewオブジェクトでは機能しません。

編集:より正確に言うと、memoryviewsはある種のスライス割り当てをサポートしていますが、すべてではありません。また、255をスライスに割り当てることは、実際にはバイト値を繰り返すことを意味することを理解するのに十分な「スマート」ではありません。例:

>>> b = bytearray(b "abcd")
>>> m = memoryview(b)
>>> m [0:2] = b "xy"
>>> b
bytearray(b'xycd')
>>> m [0:2] = 255
トレースバック(最後の最後の呼び出し):
  ファイル""、1行目、
TypeError:'int'はバッファインターフェイスをサポートしていません
>>> m [0:2] = b "x"
トレースバック(最後の最後の呼び出し):
  ファイル""、1行目、
ValueError:memoryviewオブジェクトのサイズを変更できません
>>> m [0 :: 2] = b "xy"
トレースバック(最後の最後の呼び出し):
  ファイル""、1行目、
NotImplementedError
于 2009-12-27T01:29:55.907 に答える