You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用退出时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:01:55