29.8. atexit — 退出处理程序 — Python 文档
来自菜鸟教程
Python/docs/3.6/library/atexit
29.8. atexit — 退出处理程序
atexit 模块定义了注册和注销清理函数的函数。 这样注册的函数会在正常解释器终止时自动执行。 atexit 以 反向 注册顺序运行这些函数; 如果您注册 A
、B
和 C
,在解释器终止时,它们将按 C
、B
的顺序运行, 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,则不做任何处理。
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.")
这仅适用于可以不带参数调用的函数。