Skip to main content

29.8. atexit —退出处理程序


atexit 模块定义了注册和注销清除函数的函数。这样注册的函数在正常解释器终止时自动执行。 atexit 以它们注册的 reverse 顺序运行这些功能;如果您注册 ABC,在解释程序终止时,它们将以 CBA 的顺序运行。

注意: 当检测到Python致命内部错误或调用 os._exit() 时,通过此模块注册的函数不会被未由Python处理的信号杀死。

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

func 注册为在终止时执行的函数。任何要传递给 func 的可选参数必须作为参数传递给 register()。可以多次注册相同的函数和参数。

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

如果在执行退出处理程序期间引发异常,则会打印回溯(除非出现 SystemExit),并保存异常信息。在所有退出处理程序有机会运行后,最后一个异常被提出是重新提出。

此函数返回 func,这使得它可以使用它作为装饰器。

atexit.unregister(func)

从解释器关闭时要运行的函数列表中删除 func。在调用 unregister() 之后,当解释器关闭时,即使它被注册了多次,也保证不会调用 func。如果 func 以前未注册,unregister() 将默认不执行任何操作。

参见

模块 readline

atexit 读取和写入 readline 历史文件的有用示例。

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

用作 decorator:

import atexit

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

这只适用于可以在没有参数的情况下调用的函数。