2010-08-20 5 views
0

L'ensemble du scénario est comme ceci:python Ctype: problème avec rappel à faire bibliothèque personnalisée python

  • il y a une setmessagelistener fonction (a_structure, function_pointer) dans ma bibliothèque c.
  • Je vous écris une bibliothèque python qui est une enveloppe sur la bibliothèque c mentionnée ci-dessus à l'aide ctypes. donc ce que je l'ai fait est quelque chose comme ceci:

    def setlistener(a_structure,function_pointer) 
    
    listenerDeclaration = CFUNCTYPE(c_void_p, c_void_p) 
    
    listenerFunction = listenerDeclaration(function_pointer) 
    
    setMsgListener = c_lib.setMessageListener 
    
    setMsgListener.argtypes = [c_void_p, c_void_p] 
    
    setMsgListener.restype = c_ubyte 
    
    if (setMsgListener(a_structure, listenerFunction)==0): 
    
        sys.exit("Error setting message listener.") 
    
  • Maintenant, un autre programme Python ci-dessus utilise la fonction de ma bibliothèque Python pour faire le travail, mais le problème est:

quand je lance le programme cela me donne une erreur de segmentation car l'objet local (listenerfunction) est déjà récupéré (je pense) quand le contrôle est retourné par la fonction de la bibliothèque setListener() car il s'agit d'un objet local.

est-il une solution de contournement/solution à ce problème? Ou ai-je quelque chose manquant? veuillez suggérer ... merci à l'avance

+0

quelqu'un ici ..? – ash

Répondre

1

Comme vous le suspectez, vous devez conserver une référence à listenerFunction aussi longtemps que nécessaire. Peut-être enveloppez la fonction dans une classe, créez une instance et définissez la fonction listenerFunction en tant que variable membre.

Voir la documentation Python pour ctypes callbacks, en particulier la note importante à la fin de la section.