2012-03-16 2 views
11

Pythonスクリプトが正しく終了しているかどうかを知りたい。このため私はatexitを使用していますが、問題は、atexitがsys.exit(0)で呼び出された場合と、非ゼロまたは例外で呼び出された場合の区別方法がわかりません。atexitコールバックがPythonで呼び出されたときに終了コードまたは理由を見つける方法はありますか?

推論:プログラムが正常に終了すると、何も起こりませんが、例外によってプログラムが終了するか、ゼロ以外のエラーコード(終了ステータス)が返された場合、何らかのアクションをトリガーします。

共通のモジュールをインポートしている十数個のスクリプトに同じ動作を追加したいので、なぜ私がtry/finallyを使用していないのか不思議に思うかもしれません。すべてを変更するのではなく、インポートするモジュールにatexit()ハックを追加し、すべてのモジュールでこの動作をフリーにしたいと考えています。

+0

何を達成したいですか?なぜ適切なエラー処理を使用しないのですか? –

答えて

7

あなたが解決し得ることができ、このsys.excepthookとによってを使用してサルのパッチ適用sys.exit()

import atexit 
import sys 

class ExitHooks(object): 
    def __init__(self): 
     self.exit_code = None 
     self.exception = None 

    def hook(self): 
     self._orig_exit = sys.exit 
     sys.exit = self.exit 
     sys.excepthook = self.exc_handler 

    def exit(self, code=0): 
     self.exit_code = code 
     self._orig_exit(code) 

    def exc_handler(self, exc_type, exc, *args): 
     self.exception = exc 

hooks = ExitHooks() 
hooks.hook() 

def foo(): 
    if hooks.exit_code is not None: 
     print("death by sys.exit(%d)" % hooks.exit_code) 
    elif hooks.exception is not None: 
     print("death by exception: %s" % hooks.exception) 
    else: 
     print("natural death") 
atexit.register(foo) 

# test 
sys.exit(1) 
+0

@ソリン:それは私のために正常に動作します。フック関数をクラス(関数を変更しない)にラップし、 'sys.exit(1)'を追加しました。 Python 2.7で 'sys.exit(1)'を表示します。 –

+0

@ソリン: 'patched_exit'の中に' global exit_code'を忘れてましたか?最初は忘れましたが、答えを投稿した直後に編集しました。 –

+1

Python 3でも動作します。 –

関連する問題