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 threading模块操作多线程介绍
Apr 08 Python
Python实现控制台进度条功能
Jan 04 Python
对于Python中RawString的理解介绍
Jul 07 Python
python 排序算法总结及实例详解
Sep 28 Python
Django 前后台的数据传递的方法
Aug 08 Python
Python线程同步的实现代码
Oct 03 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
python2 对excel表格操作完整示例
Feb 23 Python
Keras 使用 Lambda层详解
Jun 10 Python
Python 列表推导式需要注意的地方
Oct 23 Python
python安装sklearn模块的方法详解
Nov 28 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 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
php与php MySQL 之间的关系
2009/07/17 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
高质量PHP代码的50个实用技巧必备(上)
2016/01/22 PHP
一些不错的js函数ajax
2008/08/20 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
JsRender for object语法简介
2014/10/31 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
利用Python破解验证码实例详解
2016/12/08 Python
Python实现的栈(Stack)
2018/01/26 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
Python闭包思想与用法浅析
2018/12/27 Python
Django框架封装外部函数示例
2019/05/28 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
我们是伦敦女孩:WalG
2018/01/08 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
个人找工作的自我评价
2013/10/17 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
安阳殷墟导游词
2015/02/10 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python