为什么sys.exit()导致回溯?

时间:2018-02-01 20:29:10

标签: python cmd exit traceback

根据 How to exit from Python without traceback? ,在Python脚本中调用sys.exit()应该在没有回溯的情况下静默退出。

import sys
sys.exit(0)

但是,当我使用python -i "exit.py"or from Notepad++)从Windows 7的命令行启动脚本时,会显示SystemExit异常的回溯。

U:\>python -i "exit.py"
Traceback (most recent call last):
  File "exit.py", line 2, in <module>
    sys.exit(0)
SystemExit: 0
>>>

为什么sys.exit()在从Windows命令行运行时显示回溯?

(供参考,我在Windows 7上使用Python 3.6.4)

5 个答案:

答案 0 :(得分:7)

您正在使用-i标志运行Python。 -i suppresses the usual special handling of the SystemExit exception sys.exit raises;由于特殊处理被抑制,Python执行正常的异常处理,打印回溯。

可以说,-i应该只能抑制&#34;退出&#34;部分特殊处理,不会导致回溯打印。你可以举bug report;我没有看到任何现有的相关报道。

答案 1 :(得分:4)

没有例外:

python exit.py 

并且您的程序已终止。

使用-i选项运行交互式(在运行脚本后以交互方式检查)并显示异常:

python -i exit.py 
Traceback (most recent call last):
  File "exit.py", line 2, in <module>
    sys.exit(0)
SystemExit: 0
>>> 

因为解释器一直在运行。

  

exit([status])

     

通过提升SystemExit(状态)退出解释器。

答案 2 :(得分:1)

因为在幕后,sys.exit(0)引发了SystemExit例外。

进一步阅读here

你想要的是:

os._exit(1)

答案 3 :(得分:0)

因为您使用的是-i选项。没有它就试试吧,你不会得到堆栈跟踪。

closeModal

答案 4 :(得分:0)

As Matt_G sayssys.exit(0)与提升SystemExit()完全相同,可以在更高级别捕获,在您使用-i时会发生这种情况。

如果你想退出而没有追溯,有os._exit(0)调用&#34; C函数&#34;并立即退出-i模式

正如@ user2357112告诉我的那样,os._exit(0)是一个没有任何清理就会退出的激烈举动。最后,__exit__atexit__del__