调用 sys.exit() 后不会触发 atexit

atexit not triggering after sys.exit() is called

我正在尝试使用 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"

但我没听懂最后一行。

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

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

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