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(),你注册的函数无法正常执行。

原创文章,作者:晴川运维,如若转载,请注明出处:https://baike.qcidc.com/4424.html

(0)
晴川运维晴川运维
上一篇 2025年6月8日
下一篇 2025年6月8日

相关推荐

  • 使用GitHub搭建专属的服务器

    现在固定公网IP资源稀缺,虽然说IPv6已经开始使用,但是用的人并不多,大部分用的都是IPv4,想要搞一个自己网站,首先就是需要一个固定的公网IP,但是每年却需要缴纳不少的mone…

    Linux系统 2025年6月8日
  • Linux终端中实现大小写字符转换

    Linux终端中提供了一些可以大小写之间转换文本的命令,通过这些命令可以提高我们的工作效率,本篇文章重点为大家讲解一下Linux终端中进行大小写字符转换具体方法。 环境 Cento…

    Linux系统 2025年6月11日
  • 分享一下Linux运维小技巧

    Linux运维人员主要是对Linux下各种网络服务、应用系统、监控系统等进行自动化脚本开发的工作,并根据项目对系统进行性能优化,下面为大家分享一下Linux运维常用小技巧。 1、查…

    Linux系统 2025年6月12日
  • 企业的六种数据存储合规性策略

    强调合规性的数据存储管理人员应该遵循行业机构分析师推荐的策略,其中包括采用自动化技术和匿名数据。存储专业人士如今有很多事情要做,但在隐私法规范围不断扩展的时代,他们的任务清单却在不…

    Linux系统 2025年6月9日
  • SELinux策略规则查看方法(seinfo和sesearch)详解

    我们知道,当前 SELinux 的默认策略是 targeted,那么这个策略中到底包含有多少个规则呢?使用 seinfo 命令即可查询。命令如下: [root@localhost …

    Linux系统 2025年6月8日
  • 详解Git-安装

    Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本…

    Linux系统 2025年6月9日
  • Linux i2c子系统(一) :编写i2c设备驱动

    I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时串行总线,常用于微控制器与外设之间的连接。本文…

    Linux系统 2025年6月8日
  • 详解Sass 变量

    Sass(Syntactically Awesome StyleSheets)是css的一个扩展开发工具,它允许你使用变量、条件语句等,使开发更简单可维护。 变量用于存储一些信息,…

    Linux系统 2025年6月10日
  • Linux常用命令mmount命令具体使用方法

    Linux mmount命令用于挂入MS-DOS文件系统。 mmount为mtools工具指令,可根据[mount参数]中的设置,将磁盘内容挂入到Linux目录中。 语法 mmou…

    Linux系统 2025年6月8日
  • Ansible基本架构与工作机制

    ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台。 一、Ansibl…

    Linux系统 2025年6月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注