Почему sys.exit () вызывает обратную трассировку?

Согласно Как выйти из Python без отслеживания?, вызов sys.exit() в скрипте Python должен завершиться молча, без следа.

import sys
sys.exit(0)

Однако, когда я запускаю свой сценарий из командной строки в Windows 7 с python -i "exit.py", (или из Notepad ++), трассировка для отображается исключение 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?

(Для справки, я использую Python 3.6.4 в Windows 7)


person Stevoisiak    schedule 01.02.2018    source источник
comment
Ты не можешь. Так реализован sys.exit().   -  person Ghilas BELHADJ    schedule 01.02.2018
comment
@GhilasBELHADJ В вашей ссылке используется документация Python 2. Вам следует сделать репост с документами Python 3.   -  person Stevoisiak    schedule 01.02.2018
comment
обратите внимание, что на самом деле это не трассировка. SystemExit исключения не имеют трассировки   -  person Jean-François Fabre    schedule 23.09.2019


Ответы (5)


Вы запускаете Python с флагом -i. -i подавляет обычную специальную обработку SystemExit исключения sys.exit вызывает < / а>; поскольку специальная обработка подавлена, Python выполняет обычную обработку исключений, которая выводит трассировку.

Возможно, -i должен только подавлять "выходную" часть специальной обработки и не вызывать печать трассировки. Вы можете создать отчет об ошибке; Я не видел никаких существующих отчетов по теме.

person user2357112 supports Monica    schedule 01.02.2018
comment
при использовании os._exit (0) вы можете выйти из -i без трассировки - person Matt. Stroh; 01.02.2018
comment
@ Matt.St: os.exit - решительный шаг, который можно прекратить без какой-либо очистки. Нет finally, __exit__, atexit, __del__ и т. Д. Здесь это вряд ли будет уместно. - person user2357112 supports Monica; 02.02.2018
comment
Вы абсолютно правы @ user2357112, но в случае, если он захочет кардинального шага, это может сработать - person Matt. Stroh; 02.02.2018

Никаких исключений не показано:

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 (status).

person Mike Müller    schedule 01.02.2018

Как говорит Мэтт_Г, sys.exit(0) - это то же самое, что и повышение SystemExit(), которое можно поймать на более высоком уровне, что в вашем случае происходит, поскольку вы используете -i.

Если вы хотите выйти без отслеживания, существует os._exit(0), который вызывает "функцию C" и немедленно выходит даже в -i режиме.

как сказал мне @ user2357112, os._exit(0) - это радикальный шаг, который завершается без какой-либо очистки. Нет, наконец, __exit__, atexit, __del__ и т. Д.

person Matt. Stroh    schedule 01.02.2018

Потому что под капотом sys.exit(0) вызывает исключение SystemExit.

Дополнительные сведения см. здесь

вы хотите:

os._exit(1)

person Matt_G    schedule 01.02.2018
comment
os._exit(1) подавит обратную трассировку, но также подавит всю очистку выхода и немедленно завершит работу. Это может вызвать потерю данных. - person user2357112 supports Monica; 01.02.2018

Потому что вы используете параметр -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
person pcarter    schedule 01.02.2018