28.9. atexit-退出处理程序

2.0 版中的新Function。

源代码: Lib/atexit.py


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

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

这是sys.exitfunc()变量提供的Function的备用接口。

注意:与其他设置sys.exitfunc的代码一起使用时,该模块不太可能正常工作。特别是,其他核心 Python 模块可以在程序员不了解的情况下自由使用atexit。使用sys.exitfunc的作者应将其代码转换为使用atexit。转换设置sys.exitfunc的代码的最简单方法是导入atexit并注册已绑定到sys.exitfunc的函数。

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

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

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

在 2.6 版中进行了更改:此函数现在返回* func *,从而可以将其用作装饰器。

See also

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

用作decorator

import atexit

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

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