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

Python中如何让while循环执行完当前迭代后再退出?

解决Python脚本收到中断后完成当前操作再退出的问题

你的代码问题在于:把try-except包裹在整个while循环外面,当触发KeyboardInterrupt时,程序会直接跳出整个try块,不会继续执行循环的剩余迭代,所以设置prepareToStop = 1也无法让循环完成当前操作。

下面给出两种可行的解决方案:

方案1:将try-except放在循环内部

调整异常捕获的位置,让每次循环迭代都能捕获中断信号,设置停止标志后继续完成当前迭代,下一次循环再退出:

import sys
import time

prepareToStop = 0
while prepareToStop == 0:
    try:
        # 这里写你的业务代码(当前需要完成的操作)
        print(prepareToStop)
        time.sleep(0.1)
    except KeyboardInterrupt:
        prepareToStop = 1
        print("\n程序将在完成当前操作后退出。\n")
        # 不要在这里加break,让当前循环体执行完毕

print("程序正在关闭...")
sys.exit()

当按下Ctrl+C时,会触发KeyboardInterrupt,设置停止标志后,当前循环的业务代码会继续执行完成,下一次循环检查到prepareToStop == 1时,就会退出循环执行关闭逻辑。

方案2:使用signal模块处理中断信号(更可靠)

利用Python标准库的signal模块注册信号处理函数,收到Ctrl+C(对应SIGINT信号)时仅设置停止标志,不中断当前正在执行的操作:

import sys
import time
import signal

prepareToStop = 0

def handle_interrupt(signum, frame):
    global prepareToStop
    prepareToStop = 1
    print("\n程序将在完成当前操作后退出。\n")

# 注册SIGINT信号的处理函数
signal.signal(signal.SIGINT, handle_interrupt)

while prepareToStop == 0:
    # 这里写你的业务代码(当前需要完成的操作)
    print(prepareToStop)
    time.sleep(0.1)

print("程序正在关闭...")
sys.exit()

这种方法不需要依赖第三方库(你代码里的keyboard模块没用到,可以去掉),而且信号处理不会打断当前正在运行的业务代码,只会设置标志,让程序在合适的时机退出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:31:15