为何keyboard.wait("enter")等待时后续input函数会在后台运行?
问题复现
最小复现代码如下:
import keyboard print("something something...") keyboard.wait("enter") while True: player1 = input("Enter name -- ") if not player1.isalpha(): print("Invalid reply!") continue break
异常表现:
代码运行到keyboard.wait("enter")阻塞等待回车键阶段,用户按下的所有字符按键会被存入系统标准输入缓存;当用户按下回车触发keyboard.wait放行后,后续input()函数会直接读取缓存中已存的按键内容,不会等待用户在姓名输入环节重新录入。例如等待阶段输入Hello123后按回车,player1会被直接赋值为Hello123,立刻触发非法输入报错,和预期交互逻辑不符。
根因分析
keyboard库通过全局键盘事件钩子实现按键监听,keyboard.wait()仅做事件判断,不会消费、清空系统标准输入流的缓存内容- 可打印字符按键按下后,会自动写入系统标准输入缓冲区排队等待读取
- Python内置
input()函数从标准输入缓冲区读取内容时,只要缓冲区有存量数据,就会直接读取返回,不会阻塞等待用户新输入
修复方案
在keyboard.wait("enter")执行完成、调用input()之前,主动清空标准输入缓冲区的残留内容即可,跨平台兼容的实现代码如下:
import keyboard import sys def flush_input_buffer(): try: # Windows平台适配 import msvcrt while msvcrt.kbhit(): msvcrt.getch() except ImportError: # Linux/macOS平台适配 import termios termios.tcflush(sys.stdin, termios.TCIOFLUSH) print("something something...") keyboard.wait("enter") # 清空等待阶段残留的输入缓存 flush_input_buffer() while True: player1 = input("Enter name -- ") if not player1.isalpha(): print("Invalid reply!") continue break
注意:Linux/macOS环境下需保证终端处于默认的规范输入模式,常规终端默认配置下该逻辑可正常运行。
内容的提问来源于stack exchange,提问作者YeetDaddy
相关产品推荐
相关产品推荐

