首页 > 解决方案 > 调用 sys.exit() 后 atexit 未触发

问题描述

我正在尝试为我使用 pyautogui 在 python 中编写的自动化脚本实现一些基本的关闭任务。我每天打开一个程序并单击某些按钮来创建每日报告。但是如果出现问题,我需要它来关闭它正在使用的程序。

我尝试使用 atexit.register,但是当我触发 sys.exit() 时它似乎没有运行。所以我写了一个测试脚本来验证它是否正在触发,而事实并非如此。

import atexit as a
import sys

def closeout():
    print("atexit triggered, closing out")

print("starting program")
print("Registering closeout with atexit")
a.register(closeout)
print(r"triggering sys.exit()")
sys.exit()

它应该打印出以下内容:

"starting program"
"Registering closeout with atexit"
"triggering sys.exit()"
"atexit triggered, closing out"

但我没有得到最后一行。

有什么想法吗?如果重要的话,我正在运行 3.7.2。

标签: pythonpython-3.xpython-3.7

解决方案


当您从 IDLE “运行模块”时,它使用compile内置函数从关联文件构建代码对象,然后使用exec. 运行代码的进程不会退出,并且SystemExit会在 IDLE 解释器中被捕获并静默忽略 - 否则包含它的脚本会导致 IDLE 退出!- 所以atexit处理程序没有运行。

此外,IDLE 的默认构建配置为在退出时删除任何注册atexit函数,因此当 IDLE 本身最终退出时,您的处理程序不会运行。(请参阅cpython 存储库中的退出函数。)


推荐阅读