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