28.9。 atexit —終了ハンドラ
バージョン2.0の新機能。
ソースコード: :source: `Lib / atexit.py`
atexit モジュールは、クリーンアップ関数を登録するための単一の関数を定義します。 このように登録された関数は、通常のインタプリタの終了時に自動的に実行されます。 atexit は、これらの関数を登録された逆の順序で実行します。 A
、B
、C
を登録すると、インタープリターの終了時に、C
、B
、 A
。
注:このモジュールを介して登録された関数は、Pythonで処理されないシグナルによってプログラムが強制終了された場合、Pythonの致命的な内部エラーが検出された場合、または os._exit()[ X203X]が呼び出されます。
これは、 sys.exitfunc()変数によって提供される機能の代替インターフェースです。
注:このモジュールは、sys.exitfunc
を設定する他のコードと一緒に使用すると正しく機能しない可能性があります。 特に、他のコアPythonモジュールは、プログラマーの知らないうちに atexit を自由に使用できます。 sys.exitfunc
を使用する作成者は、代わりに atexit を使用するようにコードを変換する必要があります。 sys.exitfunc
を設定するコードを変換する最も簡単な方法は、 atexit をインポートし、sys.exitfunc
にバインドされていた関数を登録することです。
- atexit.register(func[, *args[, **kwargs]])
func を終了時に実行する関数として登録します。 func に渡されるオプションの引数は、 register()に引数として渡す必要があります。 同じ関数と引数を複数回登録することができます。
通常のプログラム終了時(たとえば、 sys.exit()が呼び出された場合、またはメインモジュールの実行が完了した場合)、登録されたすべての関数が後入れ先出し順に呼び出されます。 通常、下位レベルのモジュールは上位レベルのモジュールの前にインポートされるため、後でクリーンアップする必要があると想定されています。
出口ハンドラーの実行中に例外が発生すると、トレースバックが出力され(
SystemExit
が発生しない限り)、例外情報が保存されます。 すべての出口ハンドラーが実行する機会を得た後、発生する最後の例外が再発生します。バージョン2.6で変更:この関数は func を返すようになり、デコレータとして使用できるようになりました。
28.9.1。 atexit 例
次の簡単な例は、モジュールがインポート時にファイルからカウンターを初期化し、プログラムの終了時に、アプリケーションが終了時にこのモジュールを明示的に呼び出すことに依存せずに、カウンターの更新された値を自動的に保存する方法を示しています。
try:
_count = int(open("counter").read())
except IOError:
_count = 0
def incrcounter(n):
global _count
_count = _count + n
def savecounter():
open("counter", "w").write("%d" % _count)
import atexit
atexit.register(savecounter)
位置引数とキーワード引数を register()に渡して、呼び出されたときに登録済み関数に渡すこともできます。
def goodbye(name, adjective):
print 'Goodbye, %s, it was %s to meet you.' % (name, adjective)
import atexit
atexit.register(goodbye, 'Donny', 'nice')
# or:
atexit.register(goodbye, adjective='nice', name='Donny')
デコレータとしての使用法:
import atexit
@atexit.register
def goodbye():
print "You are now leaving the Python sector."
これは、引数なしで呼び出すことができる関数でのみ機能します。