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 相关文章推荐
详谈python http长连接客户端
Jun 12 Python
Python_LDA实现方法详解
Oct 25 Python
详解python里的命名规范
Jul 16 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
安装docker-compose的两种最简方法
Jul 30 Python
pytorch 实现打印模型的参数值
Dec 30 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
python通过matplotlib生成复合饼图
Feb 06 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
python如何代码集体右移
Jul 20 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
django使用多个数据库的方法实例
Mar 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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php GD绘制24小时柱状图
2008/06/28 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
浅谈React高阶组件
2018/03/28 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
python中 chr unichr ord函数的实例详解
2017/08/06 Python
python实现用户管理系统
2018/01/10 Python
python 处理string到hex脚本的方法
2018/10/26 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
送餐员岗位职责范本
2014/02/21 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
一帮一活动总结
2014/05/08 职场文书
个人承诺书怎么写
2014/05/24 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书