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

如何将循环终止触发从KeyboardInterrupt改为按Enter键?

可以实现,这里给你两种可行方案

方案一:多线程监听输入(跨平台通用)

原来的单线程代码里,time.sleep(1)会阻塞主线程,没法同时监听Enter键输入。用多线程可以让循环和输入监听并行执行:

import time
import threading

def run_indefinitely(stop_event):
    while not stop_event.is_set():
        print("Running indefinitely...")
        time.sleep(1)

def wait_for_enter(stop_event):
    # 等待用户按下Enter键
    input()
    # 设置停止标志,通知循环线程退出
    stop_event.set()

if __name__ == "__main__":
    stop_event = threading.Event()
    
    # 启动循环线程
    loop_thread = threading.Thread(target=run_indefinitely, args=(stop_event,))
    loop_thread.start()
    
    # 启动输入监听线程
    input_thread = threading.Thread(target=wait_for_enter, args=(stop_event,))
    input_thread.start()
    
    # 等待输入线程结束(用户按下Enter)
    input_thread.join()
    # 等待循环线程退出
    loop_thread.join()
    
    print("Loop interrupted by user")

关键说明:

  • threading.Event()是线程安全的标志位,用来在两个线程间传递停止信号
  • 循环线程会持续检查stop_event的状态,一旦被设置就退出循环
  • 输入线程在用户按下Enter后立刻设置停止标志,不会阻塞循环的执行

方案二:非阻塞输入(分平台实现)

如果不想用多线程,可以用平台相关的API实现非阻塞输入:

适用于Linux/macOS

import time
import sys
import select

def run_indefinitely():
    while True:
        print("Running indefinitely...")
        time.sleep(1)
        
        # 非阻塞检查是否有输入
        if select.select([sys.stdin], [], [], 0)[0]:
            # 读取输入清除缓冲区
            sys.stdin.readline()
            break

if __name__ == "__main__":
    run_indefinitely()
    print("Loop interrupted by user")

适用于Windows

import time
import msvcrt

def run_indefinitely():
    while True:
        print("Running indefinitely...")
        time.sleep(1)
        
        # 检查是否有按键按下
        if msvcrt.kbhit():
            # 判断是否为Enter键
            if msvcrt.getch() == b'\r':
                break

if __name__ == "__main__":
    run_indefinitely()
    print("Loop interrupted by user")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:07:16