2016-04-29 61 views
2

我在問這是因爲我有一些使用鎖定文件的Python代碼,我想知道在哪些情況下程序可以終止而不會拋出異常(或以不可處理的方式結束),並且隨後將不存在處理和鎖定文件將不得不手動刪除。我想要做這樣的事情:python程序可以以什麼方式終止而不引發異常?

try: 
    % Check if lock file exists; if not, create it, do some processing, etc... 
finally: 
    % Process ended --or-- possibly exception thrown; clean up lock file 

例如,CTRL + C可以通過異常處理,一個破管可由異常處理,等等

的唯一的情況是我可以想象程序在沒有異常情況下可以終止的地方在於計算機的電源是否被關閉。在這種情況下,我可以寫一個腳本來清除啓動時的所有鎖定文件。還有其他人嗎?

編輯:的意思是說「鎖定文件」,而不是「標誌文件」

+1

在linux中存在着不能被捕獲一個終止信號。不知道其他平臺,但... – MCManuelLP

+1

除了Linux kill信號,還有可能的操作系統故障:Windows藍屏,Linux內核恐慌,......不是100%確定,但我猜這些情況下沒有代碼運行。 – mkiever

+0

@mkiever:那麼也有硬件故障:沒有權力,燒燬,用錘子砸等) –

回答

1

os._exit會立刻殺了一個程序,但它的使用是很好氣餒......

其他方案涉及用戶發送SIGKILL(* NIX),或在電源關閉或某種OS內核恐慌,或您的計算機跌出你的第二個故事的窗口...


請注意,我如果你有想要刪除的鎖定文件,實現相同安全級別的等效(也許更加習慣方式)是使用上下文管理器。 contextlib能幫助您:

import contextlib 

@contextlib.contextmanager 
def lock(): 
    try: 
     create_lock() 
     yield 'whatever you want' 
    finally: 
     remove_lock() 

用法是這樣的:

with lock() as x: 
    assert x == 'whatever you want' 
    do_stuff_with_lock_safety() 

顯然,這並不比你原來使用的想法更安全try/finally(這就是我使用的是什麼太) - 但是,它少用於每次使用,並且如果上下文管理器僅用於創建/刪除鎖的方式,則用戶不需要記住自己清理後如何自行清理,因爲上下文管理器可以爲您完成。

+0

但是在'with'塊中說關掉電腦的電源(或者調用os._exit())。它會清理鎖文件嗎? – Justin

+0

也許這是更合適的問作爲一個單獨的問題... – Justin

+0

@jucestain - 沒有。那是我的意思,「這不是比你最初的想法更安全」。最終,在這種情況下,你無能爲力(用Python或其他任何我知道的語言) – mgilson

0
import sys 
sys.exit(status=0) 

狀態 - 可選參數arg可以是一個整數,給出退出狀態(默認爲零),或另一種類型的對象。 https://docs.python.org/2/library/sys.html#sys.exit

負方面os._exit的()是程序結束而不調用清除處理程序,沖洗標準輸入輸出緩衝器等

+2

沒有。 'sys.exit'引發'SystemExit'異常。如果內部調用了「sys.exit」,finally應該仍然會觸發。 – mgilson

+0

對不起,但'sys.exit'是個例外,可以在代碼中處理... – mkiever

相關問題