問題タブ [pep3118]
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 - 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 - Pythonへのunsignedchar*画像
SWIGを使用してカメラライブラリのPythonバインディングを生成することができ、ライブラリの組み込み関数を使用して画像をキャプチャして保存することができました。カメラからPythonImageLibrary形式にデータを取得しようとしています。ライブラリには、カメラデータをunsignedchar*として返す関数があります。unsigned char *画像データをPythonで使用できるデータ形式に変換する方法を知っている人はいますか?基本的に、unsignedchar*画像データをPythonImageLibrary形式に変換しようとしています。
ありがとうございました。
python - 配列オブジェクトからPy_bufferを取得できないのはなぜですか?
配列に関するPythonのドキュメントには、配列がバッファインターフェイスに準拠していることが明記されています。buffer_info()メソッドを使用しないこともお勧めします。しかし、PyObject_GetBuffer()を使用してC / C ++コードからPy_Bufferを取得しようとしたり、Pythonのmemoryviewを使用したりしようとすると、失敗します。
たとえば、Pythonでは(私はバージョン2.7を使用しています):
実際、Pythonのコードベースを検索すると、bytearrayobject(bytearray)、memoryobject(memoryview)、およびstringobject(str)のみに必要なPy_TPFLAGS_HAVE_NEWBUFFERフラグが設定されています。私の理解では、ドキュメントは間違っています。配列はバッファインターフェイスをサポートしていません。
バッファインターフェイスをサポートするbytearrayを使用できますが、問題は、C / C++コードで使用できるバッファを読み取るために配列の実用的なfromfile()メソッドが必要なことです。
ファイルをバッファに読み込んで、Cコードからこのバッファを使用し、メモリコピーを使用しないようにする代替手段はありますか?(私は大きなバイナリファイルを扱いたいので、コピーはあまり望ましくないオプションです)。
python - ctypes 配列を numpy 配列として使用する場合の PEP 3118 警告
ctypes 配列を numpy 配列として使用しようとすると、次の警告メッセージが表示されます。
ただし、コードは機能しているようです。この警告を無視するのは悪い考えですか?
背景: リアルタイムでデータを生成する C DLL を呼び出しています。データを保持するために一連のバッファを DLL に渡す必要があります。次のバッファがいっぱいになるのを待っている間に、最新のバッファを numpy で処理し、結果を保存したいと思います。上記のようなコードでバッファを生成していますが、うまくいっているように見えますが、重要な問題を隠蔽したくありません。
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 バッファ プロトコルと numpy 配列
私は、商用の画像処理ライブラリの Python バインディング用の高速な非コピー インターフェイスを作成しようとしています。memoryview() によると問題ないように見える新しいスタイルのバッファ API プロトコルを実装しました。
私が理解できないのは、numpy がこのインターフェイスをキャッチしない理由です。
私は何か間違ったことをしていますか、それともデータをコピーしますが、機能する numpy 配列インターフェイスを使用する必要がありますか?
私はpython 2.7を使用していることに注意してください