python Ctype:制作python自定义库时回调的问题

时间:2010-08-20 10:26:38

标签: python callback ctypes

整个场景是这样的:

  • 我的c库中有一个函数setmessagelistener(a_structure,function_pointer)。
  • 我正在编写 python库,它是使用 Ctypes 对上述c库的包装器。 所以我做的是这样的:

    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.")
    
  • 现在,另一个python程序使用我的python库中的上述函数来完成工作,但问题是:

当我运行程序时,它给了我分段错误,因为本地对象(listenerfunction)已经被垃圾收集(我想是这样)当控件从库函数setListener()返回时它是一个本地对象。

这个问题是否有解决方法/解决方案?或者我错过了什么? 请建议...... 提前谢谢

1 个答案:

答案 0 :(得分:1)

正如您所怀疑的那样,只要需要,您就需要保持对listenerFunction的引用。也许将函数包装在一个类中,创建一个实例并将listenerFunction设置为成员变量。

请参阅ctypes callbacks的Python文档,特别是本节末尾的重要说明。