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

问题描述 投票:2回答:1

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

python python-3.x python-3.7
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.