2017-09-12 10 views
3

私はboost :: pythonを使って、void*が必要なC++関数をいくつかエクスポートしています。彼らは内部的に生のメモリ(バイトの配列)として解釈します。非常に特殊なデバイスの場合は、readwriteと考えてください。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 

答えて

3

私は非常に多くのchar*を取り、最後のpythonラインで行くことに関数のプロトタイプを修正したい。ここ

は、最小限の例です。

void*をC++で使用する理由はありません。 APIがあれば分かりますが、自分の関数でラップするのは難しくありません。

+0

これは、他のプロジェクトで使用されている従来のAPIです。変更することは不可能であり、それをラップするとそのままエクスポートするというアイデアを打ち破ります。私はPythonオブジェクトを受け入れる関数でそれをラップすることができます... –

+0

"アイデアを敗北させる" - そのアイデアの実際の価値は何ですか? (正直な質問) – sehe

+0

このような関数がたくさんあり、それぞれのラッパーを書くことは多くの作業になります。とにかく、私はこのルートをとにかく進めて、インターフェースをより慣れ親しんだPythonにする(つまり、引数として1つ持ち、それを埋め込む代わりに新しいバイト配列を返す)。それでも、バイト配列を 'void *'として使用するオプションがあるかどうかを知りたいのですが、boost(これは簡単にctypesを使って行うことができます)です。 –

関連する問題