关于python:为什么sys.exit()导致了回溯?

Why is sys.exit() causing a traceback?

如何从python退出而不进行回溯?,在python脚本中调用sys.exit()时,应静默退出,而不进行跟踪。

1
2
import sys
sys.exit(0)

但是,当我使用python -i"exit.py"从Windows7的命令行(或记事本+)启动脚本时,会显示SystemExit异常的回溯。

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

为什么当从Windows命令行运行时,sys.exit()会显示一个回溯?

(供参考,我在Windows7上使用的是python 3.6.4)


您运行的是带有-i标志的python。-i抑制了SystemExit异常sys.exit引发的通常特殊处理;由于特殊处理被抑制,python执行了正常的异常处理,打印了一个回溯。

可以说,-i只应抑制特殊处理的"退出"部分,而不应导致打印回溯。你可以提出一个bug报告;我没有看到任何现有的相关报告。


未显示异常:

1
python exit.py

你的程序被终止了。

使用-i选项运行交互(运行脚本后交互检查),异常显示:

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

因为解释器一直在运行。

exit([status])

Exit the interpreter by raising SystemExit(status).


因为在引擎盖下,sys.exit(0)引发了SystemExit例外。

在这里进一步阅读

你想要的是:

1
os._exit(1)


正如Matt_g所说,sys.exit(0)与提升SystemExit()完全相同,后者可能会被更高级别捕获,在您的情况下,这是因为您使用-i而发生的。

如果您想退出而不进行回溯,那么有一个os._exit(0),它调用一个"c函数",即使在-i模式下也会立即退出。

正如@user2357112告诉我的,os._exit(0)是一个巨大的举动,没有任何清理就退出了。不,最后是__exit__atexit__del__等。


因为你在使用-i选项。如果不使用它,就不会得到堆栈跟踪。

1
2
3
4
5
6
$ python ptest.py
$ python -i ptest.py
Traceback (most recent call last):
  File"ptest.py", line 3, in <module>
    sys.exit(0)
SystemExit: 0