Die C-Funktion myfunc
arbeitet auf einem größeren Datenblock. Die Ergebnisse sind in Blöcken auf eine Callback-Funktion zurückgegeben:Python-Objekte als Benutzerdaten in Ctypes-Callback-Funktionen
int myfunc(const char *data, int (*callback)(char *result, void *userdata), void *userdata);
Mit ctypes, es ist keine große Sache myfunc
von Python-Code aufzurufen und die Ergebnisse in eine Python-Callback-Funktion zurückgegeben zu haben ist. Dieser Rückruf funktioniert gut.
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)
Aber ist es eine Möglichkeit, ein Python-Objekt (zB eine Liste) als Benutzerdaten an die Rückruffunktion zu geben? Um das Ergebnis Brocken weg zu speichern, würde ich tun, zum Beispiel mag:
def mycb(result, userdata):
userdata.append(result)
userdata=[]
Aber ich habe keine Ahnung, wie die Python-Liste in eine c_void_p zu werfen, so dass es in dem Aufruf verwendet werden kann, um MyFunc .
Meine aktuelle Problemumgehung ist es, eine verkettete Liste als Ctypes-Struktur zu implementieren, die ziemlich umständlich ist.
Nun, das ist das Schöne an ctypes, dass alles sein kann in schlichtem Python gemacht. Daher scheint die Python C API ein Schritt zurück zu sein. Oder fehlt mir etwas? – flight
Ich meine, die Option könnte einen Ctypes-Proxy einer C-API PyObject-Struktur erstellen, die die interne Repräsentation jedes Python-Objekts sein und es weitergeben sollte ... – fortran
Seltsam. Ihr Workaround mit einer Schließung funktioniert gut unter Linux, aber das gleiche Programm stürzt unter Windows ab. – flight