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 相关文章推荐
详解Django框架中的视图级缓存
Jul 23 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
Python中dict和set的用法讲解
Mar 28 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 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
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
用python实现批量重命名文件的代码
2012/05/25 Python
用Python编程实现语音控制电脑
2014/04/01 Python
Python入门篇之数字
2014/10/20 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
Python 发送邮件方法总结
2020/08/10 Python
新浪网技术部笔试题
2016/08/26 面试题
文职个人求职信范文
2013/09/23 职场文书
网络工程师个人的自我评价范文
2013/10/01 职场文书
银行个人求职自荐信范文
2013/12/16 职场文书
房产授权委托书范本
2014/09/22 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
话题作文之学会尊重
2019/12/16 职场文书
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python