3
私はboost :: pythonを使って、void*
が必要なC++関数をいくつかエクスポートしています。彼らは内部的に生のメモリ(バイトの配列)として解釈します。非常に特殊なデバイスの場合は、read
とwrite
と考えてください。void配列を受け入れるC++関数にバイト配列を渡す
このような関数にPython bytearray
を渡すにはどうすればよいですか?
私はctypes.c_void_p.from_buffer(mybytearray)
を使用しようとしましたが、これは機能の署名と一致しません。
#include <boost/python.hpp>
void fun_voidp(void*) {}
BOOST_PYTHON_MODULE(tryit) {
using namespace boost::python;
def("fun_voidp", fun_voidp);
}
とPython側で:
import tryit
import ctypes
b = bytearray(100)
tryit.fun_voidp(b) # fail
tryit.fun_voidp(ctypes.c_void_p.from_buffer(b)) # fail
tryit.fun_voidp(ctypes.c_void_p.from_buffer(b).value) # fail
これは、他のプロジェクトで使用されている従来のAPIです。変更することは不可能であり、それをラップするとそのままエクスポートするというアイデアを打ち破ります。私はPythonオブジェクトを受け入れる関数でそれをラップすることができます... –
"アイデアを敗北させる" - そのアイデアの実際の価値は何ですか? (正直な質問) – sehe
このような関数がたくさんあり、それぞれのラッパーを書くことは多くの作業になります。とにかく、私はこのルートをとにかく進めて、インターフェースをより慣れ親しんだPythonにする(つまり、引数として1つ持ち、それを埋め込む代わりに新しいバイト配列を返す)。それでも、バイト配列を 'void *'として使用するオプションがあるかどうかを知りたいのですが、boost(これは簡単にctypesを使って行うことができます)です。 –