atexit介绍
python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作。 atexit 按注册的相反顺序执行这些函数; 例如注册A、B、C,在解释器终止时按顺序C,B,A运行。
Note:如果程序是非正常crash,或者通过os._exit()退出,注册的退出函数将不会被调用。
官方文档
atexit作用
调试终止程序时进行清理例如在调试chrome的webdriver时
示例
一般的清理逻辑
setup()
try:
text()
except Exception as e:
print('运行异常:', e)
clean()
atexit的清理逻辑
通过装饰器的方式(常用)
import atexit
@atexit.register
def clean():
print('清理环境相关的代码')
setup()
test()
通过非装饰器的方式(不常用)
from atexit import register
def main():
#pass
print('XX')
def goodbye(name, adjective):
print('Goodbye, %s, it was %s to meet you.' % (name, adjective))
register(goodbye, 'Donny', 'nice')
# or:
# register(goodbye, adjective='nice', name='Donny')
if __name__ == '__main__':
main()
删除退出函数(99%不用)
> atexit.unregister(func)
从解释器关闭时运行的函数列表中删除func。 调用unregister()后,当解释器关闭时,即使它被注册了多次,func也不会被调用。如果func没有注册过的话,则unregister()什么也不会做。
atexit的注意事项
你可以注册多个退出函数,他们会按照注册时间从晚到早以此执行。例如:
import atexit
@atexit.register
def clean_1():
函数体1
@atexit.register
def clean_2():
函数体2
会先运行clean_2()后运行clean_1()
如果clean()函数有参数,那么你可以不用装饰器,而是直接调用atexit.register(clean_1, 参数1, 参数2, 参数3=‘xxx’)。
如果程序是被你没有处理过的系统信号杀死的,那么注册的函数无法正常执行。
如果发生了严重的Python内部错误,你注册的函数无法正常执行。
如果你手动调用了os._exit(),你注册的函数无法正常执行。