2013-09-26 55 views
2

我有一個我寫的python腳本,它使用atexit.register()來運行一個函數來保存程序退出時的字典列表。但是,當腳本由於崩潰或運行時錯誤而退出時,此代碼也正在運行。通常,這會導致數據被破壞。在碰撞期間阻止python的atexit?

當程序異常退出時,有沒有辦法阻止它運行?

編輯:爲了澄清,這涉及到一個程序使用瓶,我試圖防止數據持久代碼運行在出現的錯誤引發的退出。

+2

請解釋「崩潰」,「運行時錯誤」,「異常」 – iruvar

+3

爲什麼使用'atexit()'?只需在程序結尾處寫入數據即可。 – kindall

+0

當程序到達程序結束時它不會退出,它使用瓶框架,並且對app.run()的調用結束。當我在命令行上按下CTRL-C時,它只會退出。 –

回答

4

你不想使用atexit與瓶。你想使用Flask signals.這聽起來像你正在專門尋找request_finished信號。

from flask import request_finished 
def request_finished_handler(sender, response, **extra): 
    sender.logger.debug('Request context is about to close down. ' 
         'Response: %s', response) 
    # do some fancy storage stuff. 

request_finished.connect(request_finished_handler, app) 

request_finished的好處是,它只會在成功迴應後觸發。這意味着只要在另一個信號中沒有錯誤,你應該是好的。

+0

這個答案並不完全符合我的要求,它的功能甚至比我想要的還要好,並且在程序關閉時不需要保存數據。它實際上應該解決我關心的其他一些問題。 –

+0

@ZauberParacelsus很高興幫助 – cwallenpoole

2

一種方法:在主程序全球層面:

abormal_termination = False 

def your_cleanup_function(): 
    # Add next two lines at the top 
    if abnormal_termination: 
     return 

# ... 
# At end of main program: 
try: 
    # your original code goes here 
except Exception: # replace according to what *you* consider "abnormal" 
    abnormal_termination = True # stop atexit handler 

不漂亮,但簡單;-)

+0

那麼,澄清一點,這是一個使用燒瓶框架的程序。一旦達到app.run(),它會無限期地繼續下去,直到程序退出,並且通常只有在命令行上按下CTRL-C才能強制退出。我不得不懷疑這是否被視爲異常退出,雖然... –

+0

這不是「一點點」,這是一個完全不同的宇宙;-)對不起,我對「燒瓶」一無所知。在這個問題中添加一個'flask'標記,並且在'flask'開始運行你的代碼之後,在頂部說明你無法控制任何東西? –

+0

是的,我會編輯它。 –