我有一個我寫的python腳本,它使用atexit.register()來運行一個函數來保存程序退出時的字典列表。但是,當腳本由於崩潰或運行時錯誤而退出時,此代碼也正在運行。通常,這會導致數據被破壞。在碰撞期間阻止python的atexit?
當程序異常退出時,有沒有辦法阻止它運行?
編輯:爲了澄清,這涉及到一個程序使用瓶,我試圖防止數據持久代碼運行在出現的錯誤引發的退出。
我有一個我寫的python腳本,它使用atexit.register()來運行一個函數來保存程序退出時的字典列表。但是,當腳本由於崩潰或運行時錯誤而退出時,此代碼也正在運行。通常,這會導致數據被破壞。在碰撞期間阻止python的atexit?
當程序異常退出時,有沒有辦法阻止它運行?
編輯:爲了澄清,這涉及到一個程序使用瓶,我試圖防止數據持久代碼運行在出現的錯誤引發的退出。
你不想使用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
的好處是,它只會在成功迴應後觸發。這意味着只要在另一個信號中沒有錯誤,你應該是好的。
這個答案並不完全符合我的要求,它的功能甚至比我想要的還要好,並且在程序關閉時不需要保存數據。它實際上應該解決我關心的其他一些問題。 –
@ZauberParacelsus很高興幫助 – cwallenpoole
一種方法:在主程序全球層面:
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
不漂亮,但簡單;-)
那麼,澄清一點,這是一個使用燒瓶框架的程序。一旦達到app.run(),它會無限期地繼續下去,直到程序退出,並且通常只有在命令行上按下CTRL-C才能強制退出。我不得不懷疑這是否被視爲異常退出,雖然... –
這不是「一點點」,這是一個完全不同的宇宙;-)對不起,我對「燒瓶」一無所知。在這個問題中添加一個'flask'標記,並且在'flask'開始運行你的代碼之後,在頂部說明你無法控制任何東西? –
是的,我會編輯它。 –
請解釋「崩潰」,「運行時錯誤」,「異常」 – iruvar
爲什麼使用'atexit()'?只需在程序結尾處寫入數據即可。 – kindall
當程序到達程序結束時它不會退出,它使用瓶框架,並且對app.run()的調用結束。當我在命令行上按下CTRL-C時,它只會退出。 –