問題タブ [pybuffer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - C 構造体から PyBuffer を作成する
編集:元の質問を読み直したところ、言葉遣いが非常に悪く、あいまいで、混乱しすぎてまともな答えが得られないことにすぐに気付きました。それは、昼休みの終わりに急いで質問をしたことで得られるものです. うまくいけば、これはより明確になります:
単純な C 構造を PyBuffer として Python (3.x) に公開しようとしているので、そこから MemoryView を取得できます。公開したい構造は次のようになります。
スクリプト作成者が次のようにデータにアクセスできるようにすることが私の望みです。
残念ながら、これらの構造の C API に関する既存のドキュメントはかなりまばらで、自己矛盾している箇所があり、他の箇所では完全に間違っています (ドキュメントに記載されている関数シグネチャがヘッダー内のものと一致しないなど)。これを公開する最善の方法についてのアイデア。また、コア ライブラリの一部であるべき機能を実現するためにサード パーティのライブラリを含めることは避けたいと思いますが、PyBuffer の機能はまだかなり未熟であり、おそらく NumPy のようなものがより良い選択になるでしょう。
これについて誰かアドバイスはありますか?
python - CからPyBufferのコンテンツにアクセスする
私は次のようにPythonでバッファオブジェクトを作成しました:
byte_stream
SWIGを介してC関数にパラメーターとして渡しています。次のようなデータを変換するためのタイプマップがあります。
バグがbyte_streamの実際のコンテンツ/値に到達できないいくつかの異なることを試しました。byte_stream
C APIを使用してコンテンツを変換またはアクセスするにはどうすればよいですか?Cデータをバッファに変換する方法はたくさんありますが、逆の方法で見つけることはできません。このオブジェクトをgcbで調べてみましたが、どちらも、またはデータが含まれていることを示す値もありません。
(ファイルからデータを読み取るときにデータを文字列に変換するオーバーヘッドを回避したいので、バッファーを使用しています)Linuxでpython2.6を使用しています。
--ありがとうPavel
python - itemsize > 1 の Python 3.x バッファーへの代入
Python 3.x バッファー インターフェイスを介して画像ピクセル情報 (32 ビット RGBA) のバッファーを公開しようとしています。かなり遊んだ後、私はこれを次のように機能させることができました:
そしてPythonでは、次のように遊ぶことができます:
そして、それは見事に機能します。ただし、個々のバイトではなく、完全なピクセル値 (int、4 バイト) で作業できれば素晴らしいので、バッファ フェッチを次のように変更しました。
これは実際にデータを返し、正しく読み取ることができますが、値を代入しようとすると失敗します!
ケース 1 の場合、エラーで が通知されますが'int' does not support the buffer interface
、これは残念で少し混乱します (結局、バッファー形式が "I" であることを指定しました) が、対処できます。mismatching item sizes for "my.Image" and "bytes"
ただし、2 と 3 の場合は非常に奇妙になりますmy.Image
。
私が渡すデータは明らかにその要素から得られるものと同じサイズであるため、これは私にとって非常に混乱します。itemsize が 1 より大きい場合、バッファは単純に代入を許可しないように見えます。もちろん、このインターフェイスのドキュメントは非常にまばらで、Python コードを熟読しても実際には使用例がまったく得られないため、かなり行き詰まっています。「itemsize > 1 の場合、バッファは本質的に役に立たなくなる」というドキュメントの一部が欠けているのでしょうか、何か間違ったことをしているのに見えないのでしょうか、それとも Python のバグですか? (3.1.1に対するテスト)
この(確かに高度な)問題についてあなたが与えることができる洞察に感謝します!
python - 異なるアイテムサイズでPy_bufferとPyMemoryView_FromBufferを使用する
この質問は、私が以前に尋ねた質問に関連しています。つまり、誰かが興味を持っているならこれ。基本的に、私がやりたいのは、 -objectでPy_buffer
ラップされたものを使用してC配列をPythonに公開することです。memoryview
(work = Pythonでデータを操作し、Cでstdoutに書き込むことができます)を使用して動作するようになりましPyBuffer_FillInfo
たが、自分のバッファーをロールしようとすると、C関数が戻った後にセグメンテーション違反が発生します。
PyBuffer_FillInfoはフォーマットがcharであると想定し、itemsizeフィールドを1にするため、独自のバッファーを作成する必要があります。サイズ1、2、4、および8のアイテムを提供できる必要があります。
いくつかのコード、これは実用的な例です:
PyBuffer_FillInfo
非常に単純なの実装を見て、カスタムアイテムサイズを提供できるように独自の関数をロールしました。
使い方:
私自身のバッファオブジェクトを使用した結果は、C関数が戻った後のセグメンテーション違反です。なぜこれが起こるのか、私は本当に理解していません。どんな助けでも大歓迎です。
編集私が以前に見つけられなかったこの質問に
よると、itemsize>1はまったくサポートされていない可能性があります。これにより、この質問はさらに興味深いものになります。たぶん、私がPyBuffer_FillInfo
欲しいものを保持するのに十分な大きさのメモリブロックで使用できます(たとえば、32 Cフロート)。その場合、問題はmemoryview
、Python関数でオブジェクトにPythonフロートを割り当てる方法に関するものです。質問質問。
python - Cython でバッファ API を使用する
私は、ユーザーが提供する関数ポインターを繰り返し呼び出してより多くのデータを取得する C ライブラリを使用しています。str
そのコールバックの Python 実装が、bytearray
、メモリ マップ ファイルなどの適切なデータ型を返すことができるような方法で Cython ラッパーを作成したいと思います (具体的には、 Buffer インターフェイスをサポートします)。私がこれまでに持っているものは次のとおりです。
私が書きたいコードは、同等のCコードを生成しますが、次のようになります。
生成された C コードは、私がやるべきだと思っていることのように見えます。しかし、これは不必要に Python API を掘り下げているようです。Cython は、この効果を達成するためのより優れた構文を提供していますか?
python - クラスが PEP 3118 を実装する場合の Python 2.7 での PyBufferProcs の定義
2.7にバックポートされた PEP 3118をサポートするために、ライブラリ (Python 2.7 をサポートする) のクラスを拡張している最中です。
ドキュメントから、tp_as_buffer
を指すようにフィールドを初期化する必要がありますPyBufferProcs
。ただし、2.7 のドキュメントによると、この構造体の説明には古いバッファ プロトコルのエントリしか含まれていません。ソースから、新しいプロトコル (および)の追加エントリがいくつかあることを収集し
ます。 PyBufferProcs
bf_getbuffer
bf_releasebuffer
疑問は残ります:
これらの新しいエントリが有効であることを Python に伝えるために何か特別なことをする必要がありますか?
古いプロトコルのエントリを入力する必要がありますか? (たとえば、2.7 のドキュメントには、
bf_getsegcount
null ではない可能性があると記載されています。ただし、PEP 3118 をサポートしている場合は、このエントリを使用しないでください。)
python - 2.x での Py_buffer の「多次元配列」の使用法は何ですか?
http://docs.python.org/2/c-api/buffer.html
int ndim
メモリが多次元配列として表す次元の数。0 の場合、ストライドとサブオフセットは NULL でなければなりません。
これの実際の使用法は何ですか?スキャッター ギャザー ベクター バッファーに使用されますか?
python - Python でバイナリ データをファイルからバッファにロードする
640x480 の画像のセットがあります。これらの画像を Matlab を介してバイナリ ファイル形式に変換しています…次に、各バイナリ ファイルを Python のバッファにロードし、そのバッファからデータを読み取る必要があります。誰かが私がそれを行う方法を手伝ったり、リンクを提案したりできますか? -ありがとう。