2010-04-28 5 views
6

Ich muss eine Callback-Funktion übergeben, die CFuncType (ctypes.CFUNCTYPE oder ctypes.PYFUNCTYPE ...) ist.Wie erstellt man einen CFuncType in Python

Wie kann ich eine Python-Funktion auf CFuncType oder wie kann ich eine CFunctype-Funktion in Python erstellen.

Antwort

8

habe ich vergessen, wie genial ctypes ist:

Unterhalb von http://docs.python.org/library/ctypes.html

unsere Callback-Funktion Zeiger auf ganze Zahlen kopiert wird, erhält also und muss eine ganze Zahl zurück. Zuerst haben wir den Typ für die Callback-Funktion erstellen:

CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int)) 

Für die erste Implementierung der Callback-Funktion, drucken wir einfach die Argumente, die wir bekommen, und das Rück 0 (inkrementelle Entwicklung ;-):

def py_cmp_func(a, b): 
    print "py_cmp_func", a, b 
    return 0 

Erstellen Sie den Callback C Call:

cmp_func = CMPFUNC(py_cmp_func) 
+0

Oh, ja! Das hat einfach geholfen. Vielen Dank. Ich übergebe diese cpm_func an eine ctypes.Structure, die ein Feld 'Callback' hat, ctypes.CFUNCTYPE (c_int, POINTER (c_int), POINTER (c_int)) – manson54

+0

Was würden Sie tun, wenn der Rückgabetyp des Rückrufs ist ungültig? Es gibt kein 'c_void', das als erstes Argument von' CFUNCTYPE' festgelegt werden kann. – Shahbaz

+0

Von [dies] (https://gitorious.org/telldus/telldus/commit/1108f3fad26f744c2418d22a547a17669522ce2e) sieht es so aus, als würde 'None' verwendet werden. – Shahbaz