[英]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.