问题
According to How to exit from Python without traceback?, calling sys.exit()
in a Python script should exit silently without a traceback.
import sys
sys.exit(0)
However, when I launch my script from the command line on Windows 7 with python -i "exit.py"
, (or from Notepad++), a traceback for a SystemExit exception is displayed.
U:\>python -i "exit.py"
Traceback (most recent call last):
File "exit.py", line 2, in <module>
sys.exit(0)
SystemExit: 0
>>>
Why is sys.exit()
displaying a traceback when run from the Windows command line?
(For reference, I am using Python 3.6.4 on Windows 7)
回答1:
You're running Python with the -i
flag. -i suppresses the usual special handling of the SystemExit exception sys.exit raises; since the special handling is suppressed, Python performs the normal exception handling, which prints a traceback.
Arguably, -i
should only suppress the "exit" part of the special handling, and not cause a traceback to be printed. You could raise a bug report; I didn't see any existing, related reports.
回答2:
No exception shown:
python exit.py
and your program is terminated.
Run with -i
option for interactive (inspect interactively after running script) and the exception is shown:
python -i exit.py
Traceback (most recent call last):
File "exit.py", line 2, in <module>
sys.exit(0)
SystemExit: 0
>>>
because the interpreter keeps running.
exit([status])
Exit the interpreter by raising SystemExit(status).
回答3:
Because under the hood, sys.exit(0)
raises a SystemExit
exception.
Further reading here
what you want is:
os._exit(1)
回答4:
Because you are using the -i option. Try it without that and you won't get a stack trace.
$ python ptest.py
$ python -i ptest.py
Traceback (most recent call last):
File "ptest.py", line 3, in <module>
sys.exit(0)
SystemExit: 0
回答5:
As Matt_G says, sys.exit(0)
is exactly the same as raising SystemExit()
, which can be caught in higher level, which in your case is happening since you are using -i
.
If you want to exit without traceback, there is os._exit(0)
which calls a "C function" and exit immediately even in -i
mode
as @user2357112 told me, os._exit(0)
is drastic move that exits without any cleanup. No finally, __exit__
, atexit
, __del__
, etc.
来源:https://stackoverflow.com/questions/48571212/why-is-sys-exit-causing-a-traceback