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

如何在Python脚本等待用户输入时用ESC键立即终止无限循环?

问题

需要在Python脚本运行时,在等待用户输入的环节捕获ESC按键以终止无限while循环,要求只需按下ESC键就能立即中断,而非长按。当前使用keyboard库的代码需要长按ESC才能终止,操作体验不佳,如何实现?

原代码:

import time ; import keyboard as kb

while (True):
    if kb.is_pressed('esc'):
        break
    n = str(input('f(x) = '))
    print(n)
    time.sleep(1)
解决方案

原代码的核心问题是input()会阻塞程序执行,只有当用户完成输入并回车后,程序才会回到kb.is_pressed()的判断逻辑,因此必须长按ESC直到循环回到判断点才能触发终止。要实现单次按下ESC立即终止,需要改用非阻塞的按键监听结合非阻塞输入或异常捕获的方式。

方案1:热键回调 + 异常捕获

通过keyboard.add_hotkey注册ESC的单次触发回调,设置终止标志,同时捕获输入中断的异常来退出循环:

import time
import keyboard as kb

stop_flag = False

def on_esc_trigger():
    global stop_flag
    stop_flag = True
    print("\n已触发ESC,循环终止")

# 注册ESC热键,按下一次即触发回调
kb.add_hotkey('esc', on_esc_trigger)

while not stop_flag:
    try:
        n = input('f(x) = ')
        print(n)
        time.sleep(1)
    except EOFError:
        # 捕获ESC触发的输入中断异常,直接退出
        break

# 清理注册的热键
kb.unhook_all()

方案2:非阻塞输入 + 定时检查标志

使用select模块实现非阻塞输入,让循环定期检查终止标志,无需等待用户完成输入:

import time
import keyboard as kb
import sys
import select

stop_flag = False

def on_esc_trigger():
    global stop_flag
    stop_flag = True
    print("\n已触发ESC,循环终止")

kb.add_hotkey('esc', on_esc_trigger)

while not stop_flag:
    # 检查是否有输入,超时0.1秒,避免过度占用CPU
    ready, _, _ = select.select([sys.stdin], [], [], 0.1)
    if ready:
        n = sys.stdin.readline().strip()
        print(n)
    time.sleep(0.1)

kb.unhook_all()

关键说明

  • keyboard.add_hotkey会监听按键的单次按下事件,无需长按,触发后立即修改终止标志。
  • 方案1保留了input()的原生交互体验,按下ESC后回车即可终止;方案2完全非阻塞,按下ESC后下一次循环检查就会终止,无需额外操作。

内容的提问来源于stack exchange,提问作者Brandhorst Beaumont

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:55:17