让Python在退出时强制运行一段代码

2023-11-05

atexit介绍

python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作。 atexit 按注册的相反顺序执行这些函数; 例如注册A、B、C,在解释器终止时按顺序C,B,A运行。

Note:如果程序是非正常crash,或者通过os._exit()退出,注册的退出函数将不会被调用。

官方文档

atexit作用

调试终止程序时进行清理例如在调试chrome的webdriver时

示例

一般的清理逻辑

setup()
try:
    text()
except Exception as e:
    print('运行异常:', e)
clean()

atexit的清理逻辑

通过装饰器的方式(常用)

import atexit

@atexit.register
def clean():
    print('清理环境相关的代码')

setup()
test()

通过非装饰器的方式(不常用)

from atexit import register
def main():
 #pass
 print('XX')
def goodbye(name, adjective):
 print('Goodbye, %s, it was %s to meet you.' % (name, adjective))
  
register(goodbye, 'Donny', 'nice')
# or:
# register(goodbye, adjective='nice', name='Donny')
if __name__ == '__main__':
	main()

删除退出函数(99%不用)

> atexit.unregister(func)



从解释器关闭时运行的函数列表中删除func。 调用unregister()后,当解释器关闭时,即使它被注册了多次,func也不会被调用。如果func没有注册过的话,则unregister()什么也不会做。

atexit的注意事项

你可以注册多个退出函数,他们会按照注册时间从晚到早以此执行。例如:

import atexit

@atexit.register
def clean_1():
    函数体1

@atexit.register
def clean_2():
    函数体2

会先运行clean_2()后运行clean_1()

如果clean()函数有参数,那么你可以不用装饰器,而是直接调用atexit.register(clean_1, 参数1, 参数2, 参数3=‘xxx’)。
如果程序是被你没有处理过的系统信号杀死的,那么注册的函数无法正常执行。
如果发生了严重的Python内部错误,你注册的函数无法正常执行。
如果你手动调用了os._exit(),你注册的函数无法正常执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让Python在退出时强制运行一段代码 的相关文章

随机推荐

  • PID控制器的输入量和输出量的物理关系解释

    PID控制器的输入量和输出量的物理关系解释 其实 PID基本找不到输入与输出的单位关系 但是有很强的数的关系 给定的值与反馈的值还存在偏差时 就会调整输出以达到输入与反馈的平衡 在这里 给定的电流值 反馈的也是电流值 PWM控制的是实际的输
  • 一分钟看懂IoC 原理

    本人的概念总结 一分钟让你懂得Ioc原理 1 1 IoC是什么 Ioc Inversion of Control 即 控制反转 不是什么技术 而是一种设计思想 在开发中 Ioc意味着将你设计好的对象交给容器控制 而不是传统的在你的对象内部直
  • 蓝桥杯之单词分析

    题目描述 小蓝正在学习一门神奇的语言 这门语言中的单词都是由小写英文字母组成 有些单词很长 远远超过正常英文单词的长度 小蓝学了很长时间也记不住一些单词 他准备不再完全记忆这些单词 而是根据单词中哪个字母出现得最多来分辨单词 现在 请你帮助
  • 延时函数介绍

    文章目录 基本介绍 一 sleep 二 usleep 三 mdelay 四 udelay 五 ndelay 在操作系统中和单片机处理延时方式就完全不一样了 不可能是使用for循环浪费系统资源 而是有专门的接口函数 基本介绍 Linux 中常
  • 简洁而实用的NAS导航页——Homarr

    前言 为了更好管理家庭内网中部署的各个服务 尤其访问NAS docker中的容器 之前看过一些类似的导航面板 其中这个界面看上去十分简洁 这里自己就记录和分享一下搭建过程 官方网站 Home Homarr Docs 个人环境 支持docke
  • violin plot 小提琴图 matlab R语言 Python

    最近用到violin图 在此总结制作此图的步骤 matlab 需先下载函数文件 https ww2 mathworks cn matlabcentral fileexchange 45134 violin plot 函数中有默认添加 中位数
  • GDB调试详解

    文章目录 调试信息 启动调试 调试进程 调试core文件 GDB调试命令 run continue break backtrace 与 frame info break enable disable delete list print pt
  • 基于深度学习的人脸表情识别开发

    目前深度学习很流行 很大程度减轻了图像开发的难度 表情识别是图像算法的重要研究方向 本文提供一种基于深度学习的表情识别方法 1 获取模型 深度学习的框架比较多 有TF CAFFE PYTORCH KERAS等 然后有很多网络比如resnet
  • 2022年度【产业数字化金铲奖】重磅来袭!

    出品 产业家 第二届金铲奖来了 过去的一年时间里 产业家清晰地看到 数实融合的潮水更加汹涌澎湃且势不可挡 越来越多的企业开始寻求数字化转型 它们来自金融 工业 农业 医疗 能源等等 产业数字化 已经成为当代中国的主旋律 在新的主旋律中 被看
  • OpenWrt之时区设置(夏令时设置)

    今天遇到一个客户关于设置时区问题 涉及到夏令时区 查阅一些资料终于搞明白了 记录如下 因为openwrt是基于linux内核 所以记录一下Linux的时间和时区设置 Linux的时间和时区设置 在linux中与时间相关的文件有 etc lo
  • 如何使用eclipse软件创建一个Java项目?

    同学们在参加Java的时候老师肯定会教给你们如何去创建一个项目 这里怕有些同学没记住 所以单独为大家分享一篇如何使用eclipse软件创建一个Java项目教程 感觉有用的话收藏转发一下 eclipse创建Java项目教程 1 首先我们需要打
  • 将一个Android项目作为另一个Android Library给其他项目使用

    一 eclipse中的使用 开发中如果使用eclipse将一个Android工程作为Android Library给其他项目使用 需要实现的步骤如下 1 将android工程设为库 选择工程右击选择 property gt Android
  • Flutter Plugin调用Native APIs

    关键词 Flutter Flutter Plugin Platform Channel Method Channel Flutter Package Flutter插件 Flutter是Google使用Dart语言开发的一套移动应用开发框架
  • 微信小程序 之 发布流程

    1 前期准备 先想好你的小程序是用来做什么的 是电商 服务预约 知识付费 产品展示 还是团队管理 酒店预订 主要面向的人群都是哪些 现在小程序类型繁多 你一定要对自己有清晰的定位 明确的目标 才能避免把小程序做得乱七八糟 让自己的小程序真正
  • 菜鸟操作:QString和QMap转化(QMap嵌套QMap)

    学习QT的时候遇到一个问题 我想要将QMap转成QString 用于socket通信 查了网上找不到我想到的效果 然后就用一个比较粗糙的做法来实现 以下代码是对于二级QMap操作的 主要思路 将QMap中的数据全都放到QString中 包括
  • 百度人脸识别模块使用分享

    本文出自APICloud官方论坛 感谢鲍永道的分享 首先介绍下百度人脸识别模块 baiduFaceRec baiduFaceRec模块封装了百度AI人脸识别功能 使用此模块可实现百度人脸检测 包括age beauty expression
  • DHT11解析

    一 DHT11工作原理 1 获取数据 DHT11包括一个电阻式感湿元件和一个NTC测温元件 这两个获取温湿度数据的方式都差不多 利用湿 温 敏元件的电气特性 如电阻值 随湿 温 度的变化而变化的原理进行湿 温 度测量 2 数据发送 数据格式
  • SPECjvm 2008 小记

    背景 specjvm2008是免费的 直接官网下载就可以开跑了 但俗话说的好 便宜无好货 没啥厂家买账 看官网列出的成绩公示结果 根本没几家上传成绩 另外 SPECjvm2008本身是测试JRE的执行成绩 也就是java客户端的运行成绩 但
  • IOC的两种容器对比

    Spring的IOC容器是一个提供IOC支持的轻量级容器 Spring提供了两种容器类型 BeanFactory和ApplicationContext BeanFactory 基础类型IOC容器 提供完整的IOC支持 默认采用延迟初始化策略
  • 让Python在退出时强制运行一段代码

    atexit介绍 python atexit 模块定义了一个 register 函数 用于在 python 解释器中注册一个退出函数 这个函数在解释器正常终止时自动执行 一般用来做一些资源清理的操作 atexit 按注册的相反顺序执行这些函