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

时间:2019-03-29 00:15:56

标签: python python-3.x python-3.7

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

我尝试使用atexit.register,但在触发sys.exit()时似乎没有运行。因此,我编写了一个测试脚本来验证它是否正在触发。

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

它应该打印出以下内容:

dat

但是我没有得到最后一行。

有什么想法吗?如果有问题,我正在运行3.7.2。

1 个答案:

答案 0 :(得分:1)

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

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

相关问题