6

配列に関する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コードからこのバッファを使用し、メモリコピーを使用しないようにする代替手段はありますか?(私は大きなバイナリファイルを扱いたいので、コピーはあまり望ましくないオプションです)。

4

2 に答える 2

5

memoryviewPython3バッファインターフェイスをサポートするオブジェクトでのみ機能します。array.arrayPython 3では機能しますが、Python2.7では機能しません。そのためのバグレポートを提出することをお勧めします。単にuseを使用しますbytearray(またはstr、読み取り専用で使用している場合)。どちらも問題なくサポートmemoryviewします。

于 2011-02-02T19:32:34.400 に答える
3

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

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

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

Python 2.7コードでは、関数を使用して古いスタイルのバッファーを操作し、を使用してbuffer新しいスタイルのバッファーを操作できmemoryviewます。Python3は後者のみをサポートします。

Python 2CAPIにも同様の違いがあります。PyObject_GetBufferは新しいバッファインターフェイス用、PyBuffer_FromObject/PyBuffer_FromReadWriteObjectは古いバッファインターフェイス用です(アレイで機能するはずです)。詳細については、上記のリンクを参照してください。

于 2014-05-03T22:46:44.553 に答える