atexit
atexit - 退出处理程序
2.0版本中的新功能。
源代码:
Lib / atexit.py
atexit模块定义了一个函数来注册清理函数。 如此注册的功能在正常解释器终止时自动执行。 atexit以与其注册相反的顺序运行这些功能; 如果您在注册人终止时注册A,B和C,他们将按照C,B,A的顺序运行。
注意:
当程序被未被Python处理的信号杀死,检测到Python致命内部错误或被调用时,不会调用通过此模块注册的函数os._exit()
。
这是由sys.exitfunc()
变量提供的功能的替代接口。
注意:与其他设置sys.exitfunc的代码一起使用时,该模块不太可能正常工作。 特别是,其他核心Python模块可以在程序员不知情的情况下自由使用atexit。 使用sys.exitfunc的作者应该将其代码转换为使用atexit。 转换设置sys.exitfunc的代码的最简单方法是导入atexit并注册已绑定到sys.exitfunc的函数。
atexit.register(func[, *args[, **kargs]])
注册func
作为函数在终止时执行。任何要传递给func的
可选参数都必须作为参数传递给register()
。可以多次注册相同的函数和参数。
在正常的程序结束时(例如,如果sys.exit()
被调用或主模块的执行完成),所有注册的函数将按照先进先出的顺序调用。假定较低级别的模块通常会在高级模块之前导入,因此必须稍后进行清理。
如果在执行退出处理程序期间发生异常,则会打印回溯(除非SystemExit
引发)并且保存异常信息。在所有退出处理程序有机会运行之后,最后的异常将被重新提出。
在版本2.6中更改:此函数现在返回func
,从而可以将其用作装饰器。
扩展内容
模块readline读取和写入readline历史文件的atexit的有用示例。
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."
这只适用于可以不带参数调用的函数。