整个场景是这样的:
我正在编写 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.")
当我运行程序时,它给了我分段错误,因为本地对象(listenerfunction)已经被垃圾收集(我想是这样)当控件从库函数setListener()返回时它是一个本地对象。
这个问题是否有解决方法/解决方案?或者我错过了什么? 请建议...... 提前谢谢
答案 0 :(得分:1)
正如您所怀疑的那样,只要需要,您就需要保持对listenerFunction的引用。也许将函数包装在一个类中,创建一个实例并将listenerFunction设置为成员变量。
请参阅ctypes callbacks的Python文档,特别是本节末尾的重要说明。