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函数里面的内容总会执行。

如下图所示:

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退出强制运行代码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python程序退出方式小结

    对于如何结束一个Python程序或者用Python操作去结束一个进程等,Python本身给出了好几种方法,而这些方式也存在着一些区别,对相关的几种方法看了并实践了下,同时也记录下. 参考: Python 核心编程 (第二版) 中文高清 1. sys.exit() 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 该方法中包含一个参数status,默认为0,表示正常退出,也可以为1,表示异常退出. import sys sys.e

  • Python 运行.py文件和交互式运行代码的区别详解

    代码版本:3.6.3 1. 交互式运行代码会直接给出表达式的结果,运行代码文件必须print才能在控制台看到结果. 直接给出结果: 没有print是看不到结果的: 有print才能看到结果: 另:交互式中可以用下划线 `_` 来查看上一次输出的结果.如果给下划线赋值,这个效果就没了. 另另:如果变量的值是空,不会显示 2.   交互式输出会输出原始内容,print会输出渲染后的内容 打印字符串会带着引号,换行符也原样显示了. 字符串的引号被去掉了,换行符真的换行了 3.  交互式每一句代码都是一

  • python 线程的暂停, 恢复, 退出详解及实例

    python 线程 暂停, 恢复, 退出 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到thread

  • 实现python版本的按任意键继续/退出

    某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要还是Linux下的. 要实现该功能,需要的就是暂停程序.等待并捕捉用户的一个键盘输入,然后继续执行.Python 有内建的库能帮我们实现该功能,不过要区别对待 Windows 和 Linux. 当然,Windows系统下会稍微简单一些,Windows系统下如果你安装了python的环境,默认自带的一

  • Python在线运行代码助手

    Python代码运行助手可以让你在线输入Python代码,然后通过本机运行的一个Python脚本来执行代码.原理如下: 在网页输入代码: 点击Run按钮,代码被发送到本机正在运行的Python代码运行助手: Python代码运行助手将代码保存为临时文件,然后调用Python解释器执行代码: 网页显示代码执行结果: 下载 点击右键,目标另存为:learning.py 备用下载地址:learning.py 完整代码: #!/usr/bin/env python3 # -*- coding: utf-

  • 在linux的终端退出python命令行的方法

    如下所示: Python 2.7.7 (default, Jun 3 2014, 01:46:20) [GCC 4.9.0 20140521 (prerelease)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> quitUse quit() or Ctrl-D (i.e. EOF) to

  • python中退出多层循环的方法

    1.定义标记变量:利用变量值的变化退出循环 # 第一种嵌套形式 a = [[1, 2, 3], [5, 5, 6], [7, 8, 9]] # init_i = 0 # init_j = 0 flag = True for i in range(3): for j in range(3): # print(i, j) if a[i][j] == 5: flag = False init_i = i init_j = j break if not flag: break print(init_i,

  • Python退出时强制运行一段代码的实现方法

    设想这样一个场景,你要给一个项目开发测试程序,程序开始运行的时候,会创建初始环境,测试完成以后,会清理环境. 这段逻辑本身非常简单: setup() test() clean() 但由于测试的代码比较复杂,你总是在调试的时候程序异常,导致每次clean()函数还没有来得及运行,程序就崩溃了. 你可能想到,如果这样写会怎么样呢: setup() try: text() except Exception as e: print('运行异常:', e) clean() 似乎看起来,程序一定会运行到cl

  • Python首次安装后运行报错(0xc000007b)的解决方法

    错误提示如下: 其实这是一个挺常见的系统报错,缺乏VC++库. 我安装的是python3.5.2,这个版本需要的vc版本是2015的了,下载:Microsoft Visual C++ 2015 安装完后发现就正常了: 总结 通过以上的方法就能轻松解决首次安装Python后运行报错的问题,希望本文的内容对同样遇到这个问题的朋友们能有所帮助,如果有疑问大家可以留言交流,小编会尽快给大家回复.

  • 使用Python第三方库发送电子邮件的示例代码

    目录 1. 安装 yagmail 第三方库 2. 开启 POP3.IMAP 和 SMTP 服务 2.1 POP3.IMAP 和 SMTP 简介 2.2 开启 POP3.IMAP.和 SMTP 协议 3. 发送邮件 3.1 发送第一封电子邮件 3.2 群发邮件 3.3 给邮件添加附件 3.4 设置定时器 4. 总结 Python 作为当前最热门的编程语言之一,不仅仅是因为它的学习成本低.入门容易,还因为它具有丰富的生态环境,包括内置的模块以及第三方的库,使用它能够做很多事情.例如,办公自动化也是

  • ChatGPT帮我看下这段代码有什么问题

    目录 前言 问题分析 问题复现 问题原因 问题解决 ChatGPT 分析 ChatGPT 分析代码 ChatGPT 实现功能 总结 附录:ChatGPT 写代码测试 问1 问2 问3 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多系列文章. 今天一个很简单的功能,触发了一个 BUG,处理后我想起了最近爆火的 ChatGPT,于是我尝试测试 ChatGPT 能否发现这个 BUG.这篇文章会先介绍功能代码,然后手动分析 BUG 原因:接着测试 Cha

  • Android Studio之Debug运行期代码植入的方法

    我们开发中经常使用IDE的Debug功能,使用最频繁的就是断点查看变量内容,这篇文章主要是介绍在Debug时很常用的一些功能,如Debug变量更新.动态代码植入等. 背景 看下面一段代码 @Data @ToString @AllArgsConstructor public class User { private String name; private String sex; } public class Client { private static final String[] NAMES

  • python运行时强制刷新缓冲区的方法

    需求:打印一颗"*"休息1s 代码如下: #!/usr/bin/python #coding=utf-8 ''' 暂停1s输出 ''' import time def printStar(n): for i in range(n): print " * ", time.sleep(1) if __name__ == '__main__': printStar(10) 输出结果(等待10s后一次性输出): [root@miner_k test]# python sle

  • python每天定时运行某程序代码

    思路:利用time函数返回的时间字符串与指定时间字符串做比较,相等的时候执行对应的操作.不知道大家的思路是什么,感觉这样比较耗CPU.... 此处设置为15:30:10 输出相应内容,需要执行什么,就修改什么. import time while True: time_now = time.strftime("%H:%M:%S", time.localtime()) # 刷新 if time_now == "15:30:10": #此处设置每天定时的时间 # 此处3

  • Python运行错误异常代码含义对照表

    Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError 所有数值计算错误的基类 FloatingP

  • python使用js2py库运行js代码

    目录 一.js2py库概述 二.抽取js代码运行结果 三.提取js语句内变量和对象等 四.其他 在日常使用Python做爬虫,一般会用到以下手段: 请求URL,返回HTML文本,然后通过xpath.css或者re,提取数据 有些网页的数据通过AJAX异步请求加载,此时找到对应的接口,调用并直接使用接口返回的数据 有时候如果网站反爬或安全机制比较高时,则会做一些验证或者加密,比如cookie内必须携带token等信息,而这些信息是通过混淆过的js代码计算得出的. 针对1,应该是爬取大多数没有任何安

  • 如何在Spring Boot启动时运行定制的代码

    Spring Boot会自动为我们做很多配置,但迟早你需要做一些自定义工作.在本文中,您将学习如何挂钩应用程序引导程序生命周期并在Spring Boot启动时执行代码. 1.执行bean初始化的方法 Spring启动应用程序后运行某些逻辑的最简单方法是将代码作为所选bean引导过程的一部分来执行. 只需创建一个类,将其标记为Spring组件,并将应用程序初始化代码放在带有@PostConstruct注释的方法中.理论上,您可以使用构造函数而不是单独的方法,但将对象的构造与其实际责任分开是一种很好

随机推荐