Функция 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 (скажем, список) как userdata для функции обратного вызова? Чтобы сохранить куски результатов, я хотел бы сделать, например:
def mycb(result, userdata):
userdata.append(result)
userdata=[]
Но я понятия не имею, как передать список Python в c_void_p, чтобы его можно было использовать в вызове myfunc.
Мое текущее решение - реализовать связанный список как структуру ctypes, что довольно громоздко.