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怎么学好python?
Oct 07 Python
python检测lvs real server状态
Jan 22 Python
Python去除列表中重复元素的方法
Mar 20 Python
使用Python写一个小游戏
Apr 02 Python
python调用外部程序的实操步骤
Mar 04 Python
详解python selenium 爬取网易云音乐歌单名
Mar 28 Python
python输出决策树图形的例子
Aug 09 Python
使用python模拟命令行终端的示例
Aug 13 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
Python文件操作函数用法实例详解
Dec 24 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 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获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
实例讲解python函数式编程
2014/06/09 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
利用python画出折线图
2018/07/26 Python
Pytorch 实现权重初始化
2019/12/31 Python
python opencv如何实现图片绘制
2020/01/19 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
什么是python的函数体
2020/06/19 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
英文自荐信常用句子
2014/03/26 职场文书
跳蚤市场口号
2014/06/13 职场文书
国企干部对照检查材料
2014/08/22 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫