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网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
python实现支持目录FTP上传下载文件的方法
Jun 03 Python
Python 字典与字符串的互转实例
Jan 13 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
python求质数的3种方法
Sep 28 Python
详解python运行三种方式
May 13 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
基于Python实现人脸自动戴口罩系统
Feb 06 Python
Python中itertools的用法详解
Feb 07 Python
利用python+request通过接口实现人员通行记录上传功能
Jan 13 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作的文本留言本的例子(三)
2006/10/09 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
python中list循环语句用法实例
2014/11/10 Python
Python中操作MySQL入门实例
2015/02/08 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
详解python之配置日志的几种方式
2017/05/22 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
python实现ftp文件传输功能
2020/03/20 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
春游踏青活动方案
2014/08/14 职场文书
离婚协议书怎么写
2014/09/12 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
公务员年度个人总结
2015/02/12 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
详解Python函数print用法
2021/06/18 Python
nginx实现动静分离的方法示例
2021/11/07 Servers