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
相关产品推荐
相关产品推荐

