atexit ---退出处理程序


这个 atexit 模块定义用于注册和注销清理函数的函数。这样注册的函数在正常解释器终止时自动执行。 atexit 在中运行这些函数 reverse 它们的注册顺序;如果您注册 ABC ,在解释器终止时,它们将按顺序运行 CBA .

注: 当程序被未由python处理的信号杀死时,当检测到python致命的内部错误时,或当 os._exit() 被称为。

在 3.7 版更改: 当与C-API子解释器一起使用时,注册函数是它们注册的解释器的本地函数。

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

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

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

如果在执行退出处理程序期间引发异常,将打印一个跟踪(除非 SystemExit 并保存异常信息。在所有退出处理程序都有机会运行最后一个要引发的异常之后,将重新引发该异常。

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

atexit.unregister(func)

去除 func 从解释器关闭时要运行的函数列表中。调用后 unregister()func 保证在解释器关闭时不会被调用,即使它注册了多次。 unregister() 安静地不做任何事情 func 以前没有注册过。

参见

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

作为一种用法 decorator ::

import atexit

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

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