29.8. atexit — 退出处理程序 — Python 文档

来自菜鸟教程
Python/docs/3.6/library/atexit
跳转至:导航、​搜索

29.8. atexit — 退出处理程序


atexit 模块定义了注册和注销清理函数的函数。 这样注册的函数会在正常解释器终止时自动执行。 atexit反向 注册顺序运行这些函数; 如果您注册 ABC,在解释器终止时,它们将按 CB 的顺序运行, A

注:当程序被Python未处理的信号杀死,检测到Python致命的内部错误时,或当os._exit()[ X203X] 被调用。

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

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

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

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

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

atexit.unregister(func)
从解释器关闭时要运行的函数列表中删除 func。 调用 unregister() 后,func 保证在解释器关闭时不会被调用,即使它被注册了多次。 unregister() 如果之前未注册 func,则不做任何处理。

也可以看看

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

用作 装饰器

import atexit

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

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