网易首页 > 网易号 > 正文 申请入驻

Python 库手册:atexit 程序退出回调

0
分享至

atexit 是 Python 标准库中的一个模块,用于注册程序正常终止时要自动执行的清理函数(回调)。它常被用来释放资源、保存数据或打印结束信息,避免在代码中分散编写退出处理逻辑。

常见应用场景:

(1)资源释放

在程序退出前关闭文件、网络连接或数据库连接。

(2)保存运行状态

在退出前将运行结果或缓存写入磁盘,方便下次启动继续使用。

(3)记录日志

在程序结束时统一写入退出日志。

(4)模拟析构行为

类似于 C++ 的 atexit,可将“退出动作”集中注册管理。

◆ ◆

核心概念

1、注册函数(register)

使用 atexit.register(func, *args, **kwargs) 将函数及参数注册为退出时执行的回调。

2、执行顺序

注册的回调函数按后进先出(LIFO) 顺序执行,即最后注册的先执行。

3、触发条件

程序正常退出(脚本执行完毕,或调用 sys.exit())时触发。

异常未捕获导致退出时,回调仍会执行。

注意:调用 os._exit() 退出不会执行回调。

4、参数传递

可以在 register() 时为回调函数指定位置参数和关键字参数。

5、注销函数(unregister)

Python 3.9+ 提供 atexit.unregister(func) 可移除已注册的回调。

◆ ◆

基本用法

# test.py
import atexit

def goodbye():
    print("程序已结束,执行清理操作...")

atexit.register(goodbye)

print("程序正在运行...")

运行:

python test.py

结果:

程序正在运行...
程序已结束,执行清理操作...

◆ ◆

应用举例

例 1、保存运行数据

import atexit
import json

data = {"count": 0}

def save_data():
    with open("data.json", "w") as f:
        json.dump(data, f)
    print("数据已保存。")

atexit.register(save_data)

for i in range(5):
    data["count"] += 1
    print(f"当前计数:{data['count']}")

运行结果:

程序退出时,会自动调用 save_data() 将 data 保存到 data.json。

例 2、多个回调函数

import atexit

def cleanup():
    print("释放资源...")

def log_exit():
    print("写入退出日志...")

atexit.register(cleanup)
atexit.register(log_exit)  # 后注册的先执行

print("主程序结束。")

输出:

主程序结束。
写入退出日志...
释放资源...

说明:log_exit() 先执行,因为它后注册。

例 3、注册带参数的回调

import atexit

def goodbye(name, age=None):
    print(f"再见,{name}!年龄:{age}")

atexit.register(goodbye, "Alice", age=20)

print("程序运行中...")

输出:

程序运行中...
再见,Alice!年龄:20

例 4、注销回调(Python 3.9+)

import atexit

def task():
    print("清理任务执行")

atexit.register(task)
atexit.unregister(task)  # 注销

print("程序结束")

输出:

程序结束

回调已被移除,因此程序退出时不会执行 task()。

◆ ◆

常用函数速览

atexit.register(func, *args, **kwargs)

注册一个函数作为退出回调。

参数

func:退出时要调用的函数对象

*args / **kwargs:传递给函数的参数

返回:返回 func,便于装饰器用法

atexit.unregister(func)

移除已注册的回调函数(Python 3.9+)。

参数

func:已注册的函数对象

返回:无

◆ ◆

补充说明

1、与 finally 的区别

finally 块在代码执行到特定位置时立即执行;

atexit 注册的回调会在整个程序完全退出前统一执行。

2、与类析构方法的区别

__del__ 是对象销毁时调用,而 atexit 是程序退出时调用。

3、不执行的情况

调用 os._exit() 或发生某些致命错误(如段错误)会直接终止进程,不会执行回调。

4、调试建议

在注册的函数里避免抛出异常,否则可能中断后续回调执行。

回调函数应简短、可快速完成,以免阻塞程序退出过程。

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
明确规定来了!机关事业单位职工下班后打牌打麻将,算违纪吗?

明确规定来了!机关事业单位职工下班后打牌打麻将,算违纪吗?

阿纂看事
2026-01-24 09:56:48
最近军队采购领域爆出个大新闻,纯属顶风作案。

最近军队采购领域爆出个大新闻,纯属顶风作案。

安安说
2026-01-28 09:28:28
放过观众吧!这5位春晚“混子”演啥都不好看,难怪遭到观众抵制

放过观众吧!这5位春晚“混子”演啥都不好看,难怪遭到观众抵制

徐徐道史
2025-12-19 20:01:39
结束访华,英国首相发了一段视频

结束访华,英国首相发了一段视频

环球时报国际
2026-01-31 21:16:59
1958年,张治中对主席说:有个人借我3000元未还,他官很大

1958年,张治中对主席说:有个人借我3000元未还,他官很大

芊芊子吟
2026-01-31 12:30:06
美联储迎40年来最大变革?新主席凯文·沃什计划砍掉6万亿资产?

美联储迎40年来最大变革?新主席凯文·沃什计划砍掉6万亿资产?

现代小青青慕慕
2026-02-01 14:16:55
原来花小钱就能过得舒服很多,网友:不要心疼电费,该省省该花花

原来花小钱就能过得舒服很多,网友:不要心疼电费,该省省该花花

另子维爱读史
2026-01-23 20:02:10
抗战时,一个军阀手握20万重兵,却始终没动一兵一卒,这人是谁?

抗战时,一个军阀手握20万重兵,却始终没动一兵一卒,这人是谁?

卿昀
2025-01-25 21:22:58
国家再发“预警”,春节期间别去日本,如果爆发战争,会一起挨炸

国家再发“预警”,春节期间别去日本,如果爆发战争,会一起挨炸

我心纵横天地间
2026-01-29 14:45:20
越南大洗牌!选出最高领导人后,第一个电话还是打给了北京

越南大洗牌!选出最高领导人后,第一个电话还是打给了北京

港湾无船
2026-01-28 20:37:20
退休后存80万养老,女婿问存款,我说就3万,隔天收到法院传票

退休后存80万养老,女婿问存款,我说就3万,隔天收到法院传票

船长与船1
2026-02-01 08:46:21
失业的人越来越多了

失业的人越来越多了

曹多鱼的财经世界
2025-12-24 14:56:20
发一张教室女生走光图!

发一张教室女生走光图!

果粉之家
2026-01-30 12:23:03
陈百强自杀真相曝光!王晶揭穿32年豪门谎言:他根本不是为情所困

陈百强自杀真相曝光!王晶揭穿32年豪门谎言:他根本不是为情所困

八斗小先生
2025-12-08 11:07:02
不等春节?美航母或1天内开战,中方不许3事发生,俄英法已选边站

不等春节?美航母或1天内开战,中方不许3事发生,俄英法已选边站

阿伧说事
2026-01-28 15:22:57
戴安娜的弟弟才是狠角色,因为前妻的缘故,缺席3个女儿的婚礼

戴安娜的弟弟才是狠角色,因为前妻的缘故,缺席3个女儿的婚礼

小书生吃瓜
2026-02-01 17:30:29
安徽一男子参加公司年会,先后抽中10万元彩票和苹果17ProMax,活动负责人:纯运气,无暗箱操作

安徽一男子参加公司年会,先后抽中10万元彩票和苹果17ProMax,活动负责人:纯运气,无暗箱操作

台州交通广播
2026-02-01 18:08:46
联合国5常全摊牌,中方切断高市后路,首相宝座,只能坐8天了?

联合国5常全摊牌,中方切断高市后路,首相宝座,只能坐8天了?

知鉴明史
2026-01-31 18:38:21
莫言:人是很奇怪的生物,你哭哭啼啼时,没有几个人真同情你,更多的是……

莫言:人是很奇怪的生物,你哭哭啼啼时,没有几个人真同情你,更多的是……

乔话
2026-01-31 22:52:04
刘晓庆自曝和前任还保持联系:因为我们共同度过了非常美好的时光

刘晓庆自曝和前任还保持联系:因为我们共同度过了非常美好的时光

喜欢历史的阿繁
2026-02-01 21:18:41
2026-02-02 06:19:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1732文章数 72关注度
往期回顾 全部

科技要闻

10亿元宝红包突袭 复刻微信支付还是微视?

头条要闻

特朗普又有疯狂想法:白宫格斗赛 首都飙赛车

头条要闻

特朗普又有疯狂想法:白宫格斗赛 首都飙赛车

体育要闻

德约大度祝贺阿卡 幽默互动逗笑纳达尔

娱乐要闻

春晚第三次联排阵容曝光:全是实力派

财经要闻

黄仁勋台北"夜宴":汇聚近40位台企高管

汽车要闻

岚图汽车1月交付10515辆 同比增长31%

态度原创

家居
健康
教育
房产
时尚

家居要闻

蓝调空舍 自由与个性

耳石症分类型,症状大不同

教育要闻

语不惊人死不休,立刚反对学英语有些着魔了,又出新谬论

房产要闻

藏不住的小城大事,海澄新城执掌自贸港风口,进阶兑现美好生活新篇

“多巴胺风”又又又火了!这样穿时髦又减龄

无障碍浏览 进入关怀版