我的Python程序需要很多時間才能完成for循環的所有迭代。當我在鍵盤上運行某個特定的鍵/組合鍵時,我希望它進入另一種方法並將變量保存到磁盤中(使用我知道的pickle)並安全地退出程序。如何讓Python程序進入函數並在運行時用Ctrl + X結束?
任何想法我可以做到這一點?
KeyboardInterrupt是一種安全的方法,只需要將Keyboard循環內部的for循環包裝起來,並捕獲它,然後將變量保存在except塊中?
我的Python程序需要很多時間才能完成for循環的所有迭代。當我在鍵盤上運行某個特定的鍵/組合鍵時,我希望它進入另一種方法並將變量保存到磁盤中(使用我知道的pickle)並安全地退出程序。如何讓Python程序進入函數並在運行時用Ctrl + X結束?
任何想法我可以做到這一點?
KeyboardInterrupt是一種安全的方法,只需要將Keyboard循環內部的for循環包裝起來,並捕獲它,然後將變量保存在except塊中?
只有在處,每指向您的循環,您的變量才處於允許您保存並稍後恢復的狀態。
爲了安全起見,您可以在它發生之前捕獲KeyboardInterrupt
,並設置一個可供您測試的標誌。要做到這一點,你需要截獲導致KeyboardInterrupt
的信號,即SIGINT
。在您的信號處理程序中,您可以設置一個標誌,在您的計算功能中測試該標誌。例如:
import signal
import time
interrupted = False
def on_interrupt(signum, stack):
global interrupted
interrupted = True
def long_running_function():
signal.signal(signal.SIGINT, on_interrupt)
while not interrupted:
time.sleep(1) # do your work here
signal.signal(signal.SIGINT, signal.SIG_DFL)
long_running_function()
關鍵優勢是您可以控制功能被中斷的點。您可以在任何你喜歡的地方添加支票if interrupted
。這有助於在功能被中斷時處於一致的可恢復狀態。
(帶python3,這可以解決更好的使用nonlocal
;這被留作因爲提問者沒有說明他們是在哪個Python版本讀者的鍛鍊; Tibial。)
(這應該根據Windows上工作到文檔,但我沒有測試過,如果不是這樣,以後會向讀者發出警告,請回報。)
感謝您的回答。今天我會試試這個報告並回報。 –
您在第三段描述的方法應該工作得很好。讓我們知道您是否有任何具體問題實施。 – Kevin
KeyboardInterrupt很好,我見過一些開源項目。可能不好的是過早地脫離循環。 – mehmetminanc
你也可以使用'dill'而不是'pickle'(後者不能處理lambda和靜態方法)。另一個好的做法是將循環中的每個迭代的結果按行方式保存在文件中。 – kurtosis