2010-04-28 7 views
6

Je dois passer une fonction de rappel qui est CFuncType (ctypes.CFUNCTYPE ou ctypes.PYFUNCTYPE ...).Comment créer un CFuncType en Python

Comment puis-je transmettre une fonction python à CFuncType ou comment créer une fonction CFuncType dans python.

Répondre

8

J'ai oublié comment impressionnant ctypes est:

Ci-dessous est Copié à partir http://docs.python.org/library/ctypes.html

donc notre fonction de rappel reçoit des pointeurs vers des entiers, et doit retourner un entier. Tout d'abord, nous créons le type de la fonction de rappel:

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

Pour la première implémentation de la fonction de rappel, nous imprimons simplement les arguments que nous obtenons, et retour 0 (développement progressif ;-):

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

Créez le rappel Callable C:

cmp_func = CMPFUNC(py_cmp_func) 
+0

Oh, ouais! Cela a juste fait l'affaire. Merci. Je passe ce cpm_func à un ctypes.Structure qui a un champ 'callback', ctypes.CFUNCTYPE (c_int, POINTER (c_int), POINTER (c_int)) – manson54

+0

Que feriez-vous si le type de retour du rappel est ' vide? Il n'y a pas de 'c_void' à spécifier en tant que premier argument de' CFUNCTYPE'. – Shahbaz

+0

De [this] (https://gitorious.org/telldus/telldus/commit/1108f3fad26f744c2418d22a547a17669522ce2e) il semble que 'None' devrait être utilisé. – Shahbaz

Questions connexes