首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

扫码关注腾讯云开发者

领取腾讯云代金券