역 추적없이 파이썬에서 나가는 방법?


277

출력에 역 추적 덤프를하지 않고 Python을 종료하는 방법을 알고 싶습니다.

여전히 오류 코드를 반환하고 싶지만 역 추적 로그를 표시하고 싶지 않습니다.

exit(number)추적없이 사용을 종료하고 싶지만 예외 (종료가 아님)의 경우 추적을 원합니다.


8
sys.exit ()는 백 트레이스를 인쇄하지 않고 실행을 중지하고 예외를 발생시킵니다 ... 질문은 기본 동작이 무엇인지 정확하게 설명하므로 아무것도 변경하지 마십시오.
Luper Rouch

@Luper sys.exit ()가 SystemExit를 던지는 지 확인하는 것은 매우 쉽습니다!
Val

4
나는 그것이 예외를 일으키지 않는 것이 아니라 역 추적을 인쇄하지 않는다고 말했다.
Luper Rouch

나는 이것이 당신이 묻는 질문에 실제로 대답한다고 생각합니다. stackoverflow.com/questions/173278/…
Stefan

2
이 질문은 Jython 2.4 또는 이와 유사한 것입니까? 최신 버전의 Python (2009 년에도 CPython 2.6 및 3.1, Jython 2.5 및 IronPython 2.6을 의미했을 때)의 경우이 질문은 의미가 없으며 최고 답변이 잘못되었습니다.
abarnert

답변:


300

아마도 예외가 발생하고 이로 인해 프로그램이 종료되고 있습니다 (추적). 따라서 가장 먼저해야 할 일은 깨끗하게 종료하기 전에 해당 예외를 포착하는 것입니다 (예를 들어 메시지가 표시 될 수 있음).

main일상 생활 에서 다음과 같이 해보십시오 .

import sys, traceback

def main():
    try:
        do main program stuff here
        ....
    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    sys.exit(0)

if __name__ == "__main__":
    main()

2
처음에는 "from sys import exit"와 같은 것이 있어야합니다.
rob

10
sys.exit ()가 "main program stuff"에서 호출되면 위의 코드는 sys.exit에 전달 된 값을 버립니다. sys.exit는 SystemExit를 발생시키고 변수 "e"는 종료 코드를 포함합니다.
bstpierre

5
난 (MSG) 열려진 sys.stderr.write에 인쇄 제안
vinilios

14
나는 강하게 에서 라인을 제거하는 제안 except Exception:sys.exit(0)포함. 처리되지 않은 모든 예외에 대한 역 추적을 인쇄하고 코드가 종료 된 후 종료하는 것이 이미 기본 동작이므로 왜 수동으로 동일한 작업을 수행해야합니까?
MestreLion

6
@jkp-의견과 관련하여 sys.exit()프로그램에 사용해야합니다. exit()대화식 쉘을위한 것입니다. Python에서 exit ()와 sys.exit ()의 차이점을 참조하십시오 . .
ire_and_curses

81

아마도 모든 예외를 잡으려고 노력하고 있으며 이것이 SystemExit발생한 예외를 잡는 것 sys.exit()입니까?

import sys

try:
    sys.exit(1) # Or something that calls sys.exit()
except SystemExit as e:
    sys.exit(e)
except:
    # Cleanup and reraise. This will print a backtrace.
    # (Insert your cleanup code here.)
    raise

일반적으로 except:예외 이름을 지정하지 않고 사용 하는 것은 좋지 않습니다. 당신이 잡기 원하지 않는 모든 종류의 것들을 잡을 SystemExit수 있으며, 또한 자신의 프로그래밍 오류를 숨길 수도 있습니다. 정리 측면에서 무언가를하지 않는 한 위의 예는 바보입니다. 다음과 같이 바꿀 수 있습니다.

import sys
sys.exit(1) # Or something that calls sys.exit().

올리지 않고 나가야 할 경우 SystemExit:

import os
os._exit(1)

unittest 및 calls에서 실행되는 코드 에서이 작업을 수행합니다 fork(). 분기 된 프로세스가 발생하면 Unittest가 나타납니다 SystemExit. 이것은 확실히 코너 케이스입니다!


4
-1 :이 코드는 어리 석습니다. 왜 catch SystemExit를 호출 sys.exit(e)해야합니까? 두 줄을 모두 제거해도 같은 효과가 있습니다. 또한 정리가 finally:아닌에 속합니다 except Exception: ... raise.
MestreLion

@ MestreLion : 당신은 공짜로 자유롭게 할 수 있지만, 당신의 바로 위의 내 의견을 읽으면 2.5+에만 해당됩니다. 내 게시물을 모두 읽으면 코드가 어리 석고 명시 적으로 의견에서 말한 것을 제안했습니다.
bstpierre

2
죄송합니다, 당신 말이 맞아요 ... 나는 파이썬 2.5에서 예외의 주요 재구성이 있다는 것을 잊었습니다. downvote를 취소하려고했지만 답변이 편집 된 경우에만 그렇게 할 수 있습니다. 따라서 2012 년에 파이썬 2.4가 고대 역사이기 때문에 2.5 이전 방법을 각주로 남겨두고 편집하고 올바른 (현재) 코드를 미리 보여주지 않겠습니까? 그것은 대답을 많이 향상시킬 것이고 나는 downvote를 취소 할 수 있고 기꺼이 그렇게 할 것입니다. :) 모두에게 윈 - 윈
MestreLion

@ MestreLion : 제안한대로 편집을 시작했지만이 대답은 실제로 질문과 2.4 환경에서만 의미가 있습니다. downvote는 나를 화나게하지 않습니다.
bstpierre


9

같은 것 import sys; sys.exit(0)?


@mestreLion 그러면 왜 Dets 06 18:53:17을 얻습니까? Traceback (가장 최근 호출) : <모듈> import sys; sys.exit (0) SystemExit : 콘솔의 org.python.core.PyException.fillInStackTrace (PyException.java:70)에서 0?
Val

3
@Val : 표준 파이썬 콘솔을 사용하지 않기 때문입니다. 자이 썬은 파이썬이 아니며, (또는 적어도 콘솔에서) 예외를 다르게 처리하는 것처럼 보입니다.
MestreLion



4

sys.exit () 사용을 피하고 대신 예외를 발생 / 처리하여 프로그램이 완전히 종료되도록하는 것이 좋습니다. 역 추적 기능을 끄려면 다음을 사용하십시오.

sys.trackbacklimit=0

스크립트 상단에 모든 트레이스 백 출력을 스쿼시하도록 설정할 수 있지만, 예를 들어 foo.py 파일과 같이 출력을 정리하려는 "알려진 오류"와 같이 좀 더 드물게 사용하는 것을 선호합니다.

import sys
from subprocess import *

try:
  check_call([ 'uptime', '--help' ])
except CalledProcessError:
  sys.tracebacklimit=0
  print "Process failed"
  raise

print "This message should never follow an error."

CalledProcessError가 발생하면 출력은 다음과 같습니다.

[me@test01 dev]$ ./foo.py
usage: uptime [-V]
    -V    display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1

다른 오류가 발생해도 여전히 전체 역 추적 출력을 얻습니다.


1
사용하기 위해 sys.trackbacklimit파이썬 3에서, 볼 이 답변 .
Acumenus

4

내장 된 파이썬 함수 quit ()를 사용하면됩니다. 라이브러리를 가져올 필요가 없습니다. 파이썬 3.4를 사용하고 있습니다.


2

나는 이렇게 할 것입니다 :

import sys

def do_my_stuff():
    pass

if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)

0

이건 어떤가요

import sys
....
....
....
sys.exit("I am getting the heck out of here!")

역 추적이없고 좀 더 명시 적입니다.


-8
# Pygame Example  

import pygame, sys  
from pygame.locals import *

pygame.init()  
DISPLAYSURF = pygame.display.set_mode((400, 300))  
pygame.display.set_caption('IBM Emulator')

BLACK = (0, 0, 0)  
GREEN = (0, 255, 0)

fontObj = pygame.font.Font('freesansbold.ttf', 32)  
textSurfaceObj = fontObj.render('IBM PC Emulator', True, GREEN,BLACK)  
textRectObj = textSurfaceObj.get_rect()  
textRectObj = (10, 10)

try:  
    while True: # main loop  
        DISPLAYSURF.fill(BLACK)  
        DISPLAYSURF.blit(textSurfaceObj, textRectObj)  
        for event in pygame.event.get():  
            if event.type == QUIT:  
                pygame.quit()  
                sys.exit()  
        pygame.display.update()  
except SystemExit:  
    pass

7
코드에 주석을 달면 응답 품질이 향상됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.