簡體   English   中英

在使用 KeyboardInterrupt 退出之前完成循環

[英]Finish loop before exiting with a KeyboardInterrupt

我有一些程序邏輯如下:

for i in range(10**6):
    foo(i)
    print("foo executed with parameter", i)
    bar(i)
    print("bar executed with parameter", i)

當我想用 Ctrl+C 中斷循環以引發KeyboardInterrupt時,就會出現問題。 我確保函數bar(i)總是在函數foo(i)之后運行; 即循環不能在兩個函數調用之間中斷(或者,如果是,我想在退出之前完成循環)。 如果在執行其中一個功能時收到中斷,我希望兩者都在退出之前完成。

在 Python 3 中這是如何實現的(使用try...except語句或其他方式)?

感謝Omer Ben Haim在評論中提供答案。

實際上,可以使用signal模塊捕獲 SIGINT 信號。 下面是一些證明這一點的概念驗證代碼:

import signal
import time

stop = False

def handler(sig, frame):
    global stop
    stop = True

signal.signal(signal.SIGINT, handler)

############

i = 0
while i<10**6 and not stop:
    print("Part 1:", i)
    time.sleep(0.5)
    print("Part 2:", i)
    time.sleep(0.5)
    i += 1

這可以很容易地使用標志來完成。 當一個KeyboardInterrupt 被觸發時(例如Ctrl+c 被按下),你捕獲它並將quit_loop 標志設置為True。
當我們完成我們需要做的事情時,我們檢查是否需要退出循環,如果需要,我們會中斷。
如果你想完全退出程序,你可以用exit()替換break

quit_loop = False
for i in range(10):
    try:
        foo()
    except KeyboardInterrupt:
        quit_loop = True
    bar()

    if quit_loop:
        break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM