Python中atexit模块的基本使用示例


Posted in Python onJuly 08, 2015

atexit模块很简单,只定义了一个register函数用于注册程序退出时的回调函数,我们可以在这个回调函数中做一些资源清理的操作。

注:如果程序是非正常crash,或者通过os._exit()退出,注册的回调函数将不会被调用。

我们也可以通过sys.exitfunc来注册回调,但通过它只能注册一个回调,而且还不支持参数。所以建议大家使用atexit来注册回调函数。但千万不要在程序中同时使用这两种方式,否则通过atexit注册的回调可能不会被正常调用。其实通过查阅atexit的源码,你会发现原来它内部是通过sys.exitfunc来实现的,它先把注册的回调函数放到一个列表中,当程序退出的时候,按先进后出的顺序调用注册的回调。如果回调函数在执行过程中抛出了异常,atexit会打印异常的文字信息,并继续执行下一下回调,直到所有的回调都执行完毕,它会重新抛出最后接收到的异常。

如果使用的python版本是2.6,还可以用装饰器的语法来注册回调函数。

下面是一个例子,展示了atexit模块的使用:
 

import atexit
 
def exit0(*args, **kwarg):
  print 'exit0'
  for arg in args:
    print ' ' * 4, arg
 
  for item in kwarg.items():
    print ' ' * 4, item
 
def exit1():
  print 'exit1'
  raise Exception, 'exit1'
 
def exit2():
  print 'exit2'  
 
atexit.register(exit0, *[1, 2, 3], **{ "a": 1, "b": 2, })
atexit.register(exit1)
atexit.register(exit2)
 
@atexit.register
def exit3():
  print 'exit3'
 
if __name__ == '__main__':
  pass

下面是程序运行的结果,可以看到回调函数执行的顺序与它们被注册的顺序刚才相反。

Python中atexit模块的基本使用示例

Python 相关文章推荐
Python中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
收藏整理的一些Python常用方法和技巧
May 18 Python
Python爬虫利用cookie实现模拟登陆实例详解
Jan 12 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
简单谈谈python中的lambda表达式
Jan 19 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
深入浅析python with语句简介
Apr 11 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
python中pandas对多列进行分组统计的实现
Jun 18 Python
python登录豆瓣并发帖的方法
Jul 08 #Python
python发送HTTP请求的方法小结
Jul 08 #Python
python友情链接检查方法
Jul 08 #Python
Python抓取百度查询结果的方法
Jul 08 #Python
Python抓取淘宝下拉框关键词的方法
Jul 08 #Python
Python根据区号生成手机号码的方法
Jul 08 #Python
Python写入CSV文件的方法
Jul 08 #Python
You might like
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
图解Python变量与赋值
2018/04/03 Python
替换python字典中的key值方法
2018/07/06 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
python集合常见运算案例解析
2019/10/17 Python
Python实现数值积分方式
2019/11/20 Python
python构造IP报文实例
2020/05/05 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
Servlet如何得到客户端机器的信息
2014/10/17 面试题
小学生元旦广播稿
2014/02/21 职场文书
天堂的孩子观后感
2015/06/11 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
Nginx安装配置详解
2022/06/25 Servers