Python退出时强制运行一段代码的实现方法


Posted in Python onApril 29, 2020

设想这样一个场景,你要给一个项目开发测试程序,程序开始运行的时候,会创建初始环境,测试完成以后,会清理环境。

Python退出时强制运行一段代码的实现方法 

这段逻辑本身非常简单:

setup()
test()
clean()

但由于测试的代码比较复杂,你总是在调试的时候程序异常,导致每次clean()函数还没有来得及运行,程序就崩溃了。

你可能想到,如果这样写会怎么样呢:

setup() 
try: 
  text() 
except Exception as e: 
  print('运行异常:', e) 
clean()

似乎看起来,程序一定会运行到clean()函数,但是,如果你代码写的多,你就应该知道,滥用try...except...会让你非常痛苦。例如它突然给你打印一个运行异常: 1。你根本不知道是哪里出了问题,也不知道具体出了什么问题。为了找到问题,你必须让程序把错误爆出来。但这样一来,clean()又不能正常运行了。

有什么办法,既能让程序报错,又能在报错已经还能运行clean()呢?

这个时候,我们就可以使用Python自带的atexit这个模块了。它的使用方法非常简单:

import atexit 
 
@atexit.register 
def clean(): 
  print('清理环境相关的代码') 
 
setup() 
test()

这样一来,我们不需要显式调用clean函数了。无论程序正常结束,还是程序异常报错,clean函数里面的内容总会执行。

如下图所示:

Python退出时强制运行一段代码的实现方法

atexit使用中有下面几个注意事项:

你可以注册多个退出函数,他们会按照注册时间从晚到早以此执行。例如:

import atexit 
 
@atexit.register 
def clean_1(): 
  ... 
 
@atexit.register 
def clean_2(): 
  ...

会先运行clean_2()后运行clean_1()

  • 如果clean()函数有参数,那么你可以不用装饰器,而是直接调用atexit.register(clean_1, 参数1, 参数2, 参数3='xxx')。
  • 如果程序是被你没有处理过的系统信号杀死的,那么注册的函数无法正常执行。
  • 如果发生了严重的Python内部错误,你注册的函数无法正常执行。
  • 如果你手动调用了os._exit(),你注册的函数无法正常执行。

到此这篇关于Python退出时强制运行一段代码的实现方法的文章就介绍到这了,更多相关python退出强制运行代码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
python列表操作使用示例分享
Feb 21 Python
跟老齐学Python之用while来循环
Oct 02 Python
学习python 之编写简单乘法运算题
Feb 27 Python
python实现按长宽比缩放图片
Jun 07 Python
对Python信号处理模块signal详解
Jan 09 Python
Python调用C语言的实现
Jul 26 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 #Python
如何使用python切换hosts文件
Apr 29 #Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 #Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 #Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 #Python
Python通过Pillow实现图片对比
Apr 29 #Python
Python unittest单元测试框架实现参数化
Apr 29 #Python
You might like
帅气的琦玉老师
2020/03/02 日漫
一个图形显示IP的PHP程序代码
2007/10/19 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
浅谈Javascript实现继承的方法
2015/07/06 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
2014年元旦感言
2014/03/06 职场文书
初三学习决心书
2014/03/11 职场文书
服装采购员岗位职责
2014/03/15 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
春游踏青活动方案
2014/08/14 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
文明礼仪倡议书
2015/04/28 职场文书
员工辞职信范文大全
2015/05/12 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android