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

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

28.9. atexit — 退出处理程序

2.0 版中的新功能。


源代码: :source:`Lib/atexit.py`



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

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

这是 sys.exitfunc() 变量提供的功能的替代接口。

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

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

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

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

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

在 2.6 版更改: 该函数现在返回 func,这使得可以将其用作装饰器。

也可以看看

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


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

用作 装饰器

import atexit

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

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