目次

前のトピックへ

28.7. abc — 抽象基底クラス

次のトピックへ

28.9. traceback — スタックトレースの表示や取り出し

このページ

28.8. atexit — 終了ハンドラ

バージョン 2.0 で追加.

atexit モジュールでは、後始末関数を登録するための関数を一つだけ定義しています。この関数を使って登録した後始末関数は、インタプリタが 終了するときに自動的に実行されます。

ノート

プログラムがシグナルで停止させられたとき、Python の致命的な内部エラーが検出されたとき、あるいは os._exit() が呼び出された ときには、このモジュールを通して登録した関数は呼び出されません。

このモジュールは、 sys.exitfunc 変数の提供している機能の代用となるインタフェースです。

ノート

sys.exitfunc を設定する他のコードとともに使用した場合には、このモジュールは正しく動作しないでしょう。特に、他のコア Python モジュールでは、プログラマの意図を知らなくても atexit を自由に使えます。 sys.exitfunc を使っている人は、代わりに atexit を使うコードに変換してください。 sys.exitfunc を設定するコードを変換するには、 atexit を import し、 sys.exitfunc へ束縛されていた関数を登録するのが最も簡単です。

atexit.register(func[, *args[, **kargs]])

終了時に実行される関数として func を登録します。すべての func へ渡すオプションの引数を、 register() へ引数としてわたさなければなりません。

通常のプログラムの終了時、例えば sys.exit() が呼び出されるとき、あるいは、メインモジュールの実行が完了したときに、登録された全ての 関数を、最後に登録されたものから順に呼び出します。通常、より低レベルのモジュールはより高レベルのモジュールより前に import されるので、 後で後始末が行われるという仮定に基づいています。

終了ハンドラの実行中に例外が発生すると、(SystemExit 以外の場合は)トレースバックを表示して、例外の情報を保存します。 全ての終了ハンドラに動作するチャンスを与えた後に、最後に送出された例外を再送出します。

バージョン 2.6 で変更: .. This function now returns func which makes it possible to use it as a decorator without binding the original name to None. この関数をデコレータとして利用できるように、 func を返すようになりました。 以前は None を返していたので、デコレータとして利用しようとすると、関数名の変数に None が代入されてしまっていました。

参考

Module readline
readline ヒストリファイルを読み書きするための atexit の有用な例です。

28.8.1. atexit の例

次の簡単な例では、あるモジュールを import した時にカウンタを初期化しておき、プログラムが終了するときにアプリケーションがこのモジュールを明 示的に呼び出さなくてもカウンタが更新されるようにする方法を示しています。

try:
    _count = int(open("/tmp/counter").read())
except IOError:
    _count = 0

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    open("/tmp/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')

デコレータ(decorator)として利用する例:

import atexit

@atexit.register
def goodbye():
    print "You are now leaving the Python sector."

もちろん、デコレータとして利用できるのは、その関数が引数を受け取らない場合に限られます。