Python 3.10脚本线程阻塞问题:实现循环与键盘监听并发并按q退出
问题分析与修复
你的代码存在三个核心问题,导致主线程被阻塞、程序无法按预期终止:
join()阻塞主线程:keyboard_listener.join()会强制主线程等待监听线程结束,但pynput的Listener是持续运行的后台线程,这直接导致后续的while循环永远无法执行。- 局部变量覆盖全局变量:
on_key_press函数里的exit_time = True会创建一个局部变量,根本不会修改全局的exit_time终止标记。 - 缺少
sleep依赖:代码中使用了sleep(1)但未导入time模块,运行时会抛出NameError。
修复后的代码
#!/usr/bin/python3 import threading import sys import time # 导入time模块,用于sleep from pynput import keyboard exit_time = False def on_key_press(key): global exit_time # 声明使用全局变量exit_time try: k = key.char except AttributeError: # 捕获特定异常,避免裸except k = key.name if k == 'q': exit_time = True return False # 返回False让Listener线程主动停止 print("Press q to close.") # 创建监听线程并设为守护线程,主线程结束时自动退出 keyboard_listener = keyboard.Listener(on_press=on_key_press) keyboard_listener.daemon = True keyboard_listener.start() # 主线程执行业务循环 while not exit_time: time.sleep(1) # 这里可以添加你的业务逻辑代码 print("主线程运行中...") print("Goodbye") sys.exit(0)
关键修改说明
- 移除
keyboard_listener.join(),让主线程能继续执行后续的while循环 - 在
on_key_press中添加global exit_time,确保修改的是全局终止标记 - 导入
time模块,解决sleep未定义的问题 - 将监听线程设为守护线程,确保主线程退出时子线程自动终止
- 按下
q时返回False,主动停止监听线程以释放资源 - 替换裸
except为AttributeError,避免捕获无关异常增加调试难度
内容的提问来源于stack exchange,提问作者BowPark
相关产品推荐
相关产品推荐

