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改变日志(logging)存放位置的示例
Mar 27 Python
python进阶教程之动态类型详解
Aug 30 Python
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
详解在Python程序中使用Cookie的教程
Apr 30 Python
python如何通过protobuf实现rpc
Mar 06 Python
python如何查看系统网络流量的信息
Sep 12 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
python matplotlib库的基本使用
Sep 23 Python
OpenCV-Python实现轮廓拟合
Jun 08 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
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
Python作用域与名字空间原理详解
2020/03/21 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
django使用graphql的实例
2020/09/02 Python
python源文件的字符编码知识点详解
2021/03/04 Python
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
2014高中生入党思想汇报范文
2014/09/13 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
python中if和elif的区别介绍
2021/11/07 Python