应用退出时keyboard模块自动创建的线程无法关闭,求解决方法
解决keyboard模块热键线程导致程序无法退出的问题
方法1:用os._exit()强制终止整个进程
sys.exit()只会退出触发它的子线程,没法终止keyboard模块的监听线程。而os._exit()会直接杀死整个Python进程,所有线程都会被强制关闭。修改你的退出函数:
import os import sys import keyboard def close_application(): keyboard.unhook_all_hotkeys() os._exit(0) # 0代表正常退出,非0数值可用于标记异常退出 keyboard.add_hotkey('win+esc', close_application) keyboard.wait() # 维持主线程运行,等待热键触发
方法2:将keyboard监听线程设为守护线程
守护线程的特性是:主线程退出时,守护线程会自动终止。在添加热键后,找到keyboard内部的监听线程并设置daemon=True:
import sys import keyboard def close_application(): keyboard.unhook_all_hotkeys() sys.exit() keyboard.add_hotkey('win+esc', close_application) # 将监听线程设为守护线程 keyboard._listener.daemon = True keyboard.wait()
注意:这个方法依赖keyboard模块的内部实现,若模块版本更新,_listener属性可能变动,需要测试验证。
方法3:手动停止keyboard的监听循环
keyboard的wait()方法会阻塞主线程,你可以在退出函数里主动停止监听循环,再退出主线程:
import sys import keyboard def close_application(): keyboard.unhook_all_hotkeys() keyboard.stop() # 终止监听循环 sys.exit() keyboard.add_hotkey('win+esc', close_application) keyboard.wait()
如果keyboard.stop()无效,可尝试用keyboard.unhook_all()替代unhook_all_hotkeys(),它会移除所有钩子,包括监听线程的底层钩子。
内容的提问来源于stack exchange,提问作者D.Moore
相关产品推荐
相关产品推荐

