atexit —退出处理程序


atexit模块定义用于注册和注销清除Function的Function。这样注册的Function会在正常解释器终止后自动执行。 atexit以注册时的“反向”Sequences 运行这些Function;如果您注册ABC,则在解释器终止时,它们将以CBA的 Sequences 运行。

注意: 当程序被非 Python 处理的 signal 杀死,检测到 Python 致命内部错误或调用os._exit()时,不会调用pass此模块注册的Function。

在版本 3.7 中更改:与 C-API 子解释器一起使用时,已注册的函数对于它们在其中注册的解释器而言是本地的。

  • atexit. register(* func *, *args * kwargs *)
    • 将* func 注册为要在终止时执行的Function。任何要传递给 func *的可选参数都必须作为参数传递给register()。可以多次注册相同的函数和参数。

在正常程序终止时(例如,如果调用了sys.exit()或主模块的执行完成),则所有注册的函数均以后进先出的 Sequences 调用。假设通常将在较低级别的模块之前导入较低级别的模块,因此必须稍后对其进行清理。

如果在执行 Export 处理程序的过程中引发异常,则会打印回溯(除非引发SystemExit)并保存异常信息。在所有退出处理程序都有机会运行之后,将重新引发要引发的最后一个异常。

该函数返回* func *,从而可以将其用作装饰器。

  • atexit. unregister(* func *)
    • 从解释器关闭时要运行的Function列表中删除* func 。调用unregister()之后,即使解释程序注册了多次,也保证在解释器关闭时不调用 func 。如果先前未注册 func *,则unregister()静默不执行任何操作。

See also

atexit Example

下面的简单示例演示了模块如何在导入文件时初始化文件中的计数器,并在程序终止时自动保存计数器的更新值,而无需依赖应用程序在终止时显式调用此模块。

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')

用作decorator

import atexit

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

这仅适用于可以不带参数调用的函数。