C関数myfunc
は、より大きなデータチャンクで動作します。結果は、コールバック関数にチャンクで返されます。
int myfunc(const char *data, int (*callback)(char *result, void *userdata), void *userdata);
ctypesを使用するとmyfunc
、Pythonコードから呼び出して、結果をPythonコールバック関数に返すことは大したことではありません。このコールバックは正常に機能します。
myfunc = mylib.myfunc
myfunc.restype = c_int
myfuncFUNCTYPE = CFUNCTYPE(STRING, c_void_p)
myfunc.argtypes = [POINTER(c_char), callbackFUNCTYPE, c_void_p]
def mycb(result, userdata):
print result
return True
input="A large chunk of data."
myfunc(input, myfuncFUNCTYPE(mycb), 0)
しかし、Pythonオブジェクト(リストなど)をユーザーデータとしてコールバック関数に渡す方法はありますか?結果のチャンクを保存するために、次のようにします。
def mycb(result, userdata):
userdata.append(result)
userdata=[]
しかし、Pythonリストをc_void_pにキャストして、myfuncの呼び出しで使用できるようにする方法がわかりません。
私の現在の回避策は、リンクリストをctypes構造として実装することですが、これは非常に面倒です。