質問

配列に関するPythonドキュメント 明らかにそれを述べています 配列 バッファインターフェイスに適合します。 buffer_info()メソッドを使用しないことさえ提案します。しかし、pyobject_getBuffer()を使用してC/C ++コードからPY_BUFFERを取得しようとするか、PythonのMemoryViewを使用しようとすると、障害が発生します。

たとえば、Pythonでは(バージョン2.7を使用しています):

>>> a = array.array('c')
>>> memoryview(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot make memory view because object does not have the buffer interface

実際、Pythonのコードベースを検索すると、bytearrayobject(bytearray)、memoryobject(memoryview)、およびstringObject(str)のみが必要なpy_tpflags_have_newbufferフラグが設定されています。私の理解には、ドキュメントは間違っています。 配列 バッファインターフェイスをサポートしていません。

バッファインターフェイスをサポートするbytearrayを使用できます。問題は、c/c ++コードで使用できるバッファーで読み取るために配列の実用的なfromfile()メソッドが必要であることです。

ファイルをバッファーに読み取り、Cコードからこのバッファーを使用できるようにする代替品はありますか?メモリコピーは含まれませんか? (大きなバイナリファイルを扱いたいと思っていますが、コピーはあまり望ましくないオプションです)。

役に立ちましたか?

解決

memoryview Python 3バッファーインターフェイスをサポートするオブジェクトでのみ機能します。 array.array Python 3ではそうですが、Python 2.7ではありません。そのためにバグレポートを提出することをお勧めします。使用するだけです bytearray (また str 使用している場合は、読み取り専用です)。両方のサポート memoryview 大丈夫です。

他のヒント

Python 2.6+には、クラシックバージョンとPython 3バージョンの2つの異なるクラスタイプがあるように、2つの異なるバッファーインターフェイスがあります。

から Python/C APIリファレンスマニュアル:

バッファインターフェイスをサポートするオブジェクトの2つの例は、文字列と配列です。文字列オブジェクトは、バッファーインターフェイスのバイト指向のフォームに文字コンテンツを公開します。配列は、古いスタイルのバッファーインターフェイスを介してその内容のみを公開できます。この制限は、Python 3には適用されません。Python3では、メモリビューオブジェクトも配列から構築できます。

Python 2.7コードでは、以下のバッファーを使用して作業できます buffer 機能、および使用した新しいスタイルのバッファー memoryview. 。 Python 3は後者のみをサポートしています。

Python 2 C APIにも同様の区別が存在します。 PyObject_GetBuffer 新しいバッファインターフェイス用です。 PyBuffer_FromObject/PyBuffer_FromReadWriteObject 古いバッファーインターフェイス用です(アレイで動作するはずです)。詳細については、上記のリンクを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top