atexit —終了ハンドラー—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/library/atexit
移動先:案内検索

atexit —終了ハンドラー


atexit モジュールは、クリーンアップ関数を登録および登録解除する関数を定義します。 このように登録された関数は、通常のインタプリタの終了時に自動的に実行されます。 atexit は、これらの関数を登録されたの順序で実行します。 ABCを登録すると、インタープリターの終了時に、CBA

注:このモジュールを介して登録された関数は、Pythonで処理されないシグナルによってプログラムが強制終了された場合、Pythonの致命的な内部エラーが検出された場合、または os._exit()[ X203X]が呼び出されます。

バージョン3.7で変更: C-APIサブインタープリターで使用する場合、登録された関数は、それらが登録されたインタープリターに対してローカルです。


atexit.register(func, *args, **kwargs)

func を終了時に実行する関数として登録します。 func に渡されるオプションの引数は、 register()に引数として渡す必要があります。 同じ関数と引数を複数回登録することができます。

通常のプログラム終了時(たとえば、 sys.exit()が呼び出された場合、またはメインモジュールの実行が完了した場合)、登録されたすべての関数が後入れ先出し順に呼び出されます。 通常、下位レベルのモジュールは上位レベルのモジュールの前にインポートされるため、後でクリーンアップする必要があると想定されています。

出口ハンドラーの実行中に例外が発生すると、トレースバックが出力され( SystemExit が発生しない限り)、例外情報が保存されます。 すべての出口ハンドラーが実行される機会があった後、発生する最後の例外が再発生します。

この関数は func を返し、デコレータとして使用できるようにします。

atexit.unregister(func)
インタプリタのシャットダウン時に実行される関数のリストから func を削除します。 unregister()は、 func が以前に登録されていなかった場合、サイレントに何もしません。 func が複数回登録されている場合、 atexit 呼び出しスタックでその関数が出現するたびに削除されます。 等価比較(==)は登録解除時に内部的に使用されるため、関数参照は一致するIDを持つ必要はありません。

も参照してください

モジュール readline
atexit の便利な例で readline 履歴ファイルを読み書きします。


atexit の例

次の簡単な例は、モジュールがインポート時にファイルからカウンターを初期化し、プログラムの終了時に、アプリケーションが終了時にこのモジュールを明示的に呼び出すことに依存せずに、カウンターの更新された値を自動的に保存する方法を示しています。

try:
    with open('counterfile') as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

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

def savecounter():
    with open('counterfile', 'w') as outfile:
        outfile.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.')

これは、引数なしで呼び出すことができる関数でのみ機能します。