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

Why is sys.exit() causing a traceback?

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

import sys
sys.exit(0)

但是,当我在 Windows 7 上使用 python -i "exit.py" 从命令行启动我的脚本时,(显示 or from Notepad++), a traceback for a 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)

因为在后台,sys.exit(0) 引发了一个 SystemExit 异常。

进一步阅读here

你想要的是:

os._exit(1)

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

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

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

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

未显示异常:

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])

Exit the interpreter by raising SystemExit(status).

, sys.exit(0) 与加注 SystemExit() 完全一样, 可以在更高的水平上捕获, 在您的情况下发生是因为您使用 -i.

如果你想退出而不回溯,有os._exit(0)调用一个"C function"并立即退出,即使在-i模式

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