プログラムが終了する前に何かをする


100

プログラムが終了する前に実行される関数または何かをどのように持つことができますか?常にバックグラウンドで実行されるスクリプトがあり、終了する前にデータをファイルに保存する必要があります。これを行う標準的な方法はありますか?


2
スクリプトが停止することはありませんが、誰かがプロセスを強制終了するか、Ctrl + \などを押します。
RacecaR

回答:


165

atexitモジュールをチェックしてください:

http://docs.python.org/library/atexit.html

たとえば、アプリケーションの終了時にメッセージを出力したい場合は、次のようにします。

import atexit

def exit_handler():
    print 'My application is ending!'

atexit.register(exit_handler)

これはスクリプトの通常の終了に最適ですが、すべてのケースで呼び出されるわけではないことに注意してください(たとえば、致命的な内部エラー)。


5
Ctrl + CまたはCtrl + \を押した場合に呼び出される場所にする方法はありますか?
RacecaR

8
Ctrl + Cを押すと呼び出されます。これは単にKeyboardInterrupt例外を発生させます。
Ned Batchelder、

1
ああ、忘れました。そして、誰かがPythonプロセスを殺した場合、あなたができることは何も実行されないと思いますか?
RacecaR

5
@RacecaR:確かに; プロセスを強制終了する目的は、プロセスを完全に停止させることです。ドキュメントから:Note The exit function is not called when the program is killed by a signal, when a Python fatal internal error is detected, or when os._exit() is called
カトリエル

18
@RacecaR、プロセスがひどくクラッシュしたり、残酷に強制終了された場合でも終了コードを実行できる唯一の方法は、「モニター」または「ウォッチドッグ」と呼ばれる別のプロセスであり、その唯一の仕事はターゲットプロセスを監視し、適切な場合は終了コードを実行します。もちろん、それは非常に異なるアーキテクチャを必要とし、その制限があります。そのような機能が必要な場合は、問題について別のQを開くのが最善です。
Alex Martelli、

32

エラーが発生した場合でも常に何かを実行したい場合は、次のtry: finally:ように使用します-

def main():
    try:
        execute_app()
    finally:
        handle_cleanup()

if __name__=='__main__':
    main()

例外も処理したい場合は、except:前に挿入することができますfinally:


13
プロセスの強制終了が原因でSIGTERMが発生した場合は機能しません。
ramu 2015

16

KeyboardInterrupt(例えばCtrl-Cを押して)を上げることでスクリプトを停止すると、標準の例外としてそれをキャッチできます。SystemExit同じようにキャッチすることもできます。

try:
    ...
except KeyboardInterrupt:
    # clean up
    raise

私はあなたがそれについて知っているように、これについて言及します。これを行う「正しい」方法は、atexit上記のモジュールです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.