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."

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