출력에 역 추적 덤프를하지 않고 Python을 종료하는 방법을 알고 싶습니다.
여전히 오류 코드를 반환하고 싶지만 역 추적 로그를 표시하고 싶지 않습니다.
exit(number)
추적없이 사용을 종료하고 싶지만 예외 (종료가 아님)의 경우 추적을 원합니다.
출력에 역 추적 덤프를하지 않고 Python을 종료하는 방법을 알고 싶습니다.
여전히 오류 코드를 반환하고 싶지만 역 추적 로그를 표시하고 싶지 않습니다.
exit(number)
추적없이 사용을 종료하고 싶지만 예외 (종료가 아님)의 경우 추적을 원합니다.
답변:
아마도 예외가 발생하고 이로 인해 프로그램이 종료되고 있습니다 (추적). 따라서 가장 먼저해야 할 일은 깨끗하게 종료하기 전에 해당 예외를 포착하는 것입니다 (예를 들어 메시지가 표시 될 수 있음).
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()
except Exception:
에 sys.exit(0)
포함. 처리되지 않은 모든 예외에 대한 역 추적을 인쇄하고 코드가 종료 된 후 종료하는 것이 이미 기본 동작이므로 왜 수동으로 동일한 작업을 수행해야합니까?
sys.exit()
프로그램에 사용해야합니다. exit()
대화식 쉘을위한 것입니다. Python에서 exit ()와 sys.exit ()의 차이점을 참조하십시오 . .
아마도 모든 예외를 잡으려고 노력하고 있으며 이것이 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
. 이것은 확실히 코너 케이스입니다!
SystemExit
를 호출 sys.exit(e)
해야합니까? 두 줄을 모두 제거해도 같은 효과가 있습니다. 또한 정리가 finally:
아닌에 속합니다 except Exception: ... raise
.
import sys
sys.exit(1)
같은 것 import sys; sys.exit(0)
?
다음 코드는 예외를 발생시키지 않으며 역 추적없이 종료됩니다.
import os
os._exit(1)
자세한 내용은이 질문과 관련 답변 을 참조하십시오. 다른 모든 답변이 너무 복잡 해지는 이유에 놀랐습니다.
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
다른 오류가 발생해도 여전히 전체 역 추적 출력을 얻습니다.
내장 된 파이썬 함수 quit ()를 사용하면됩니다. 라이브러리를 가져올 필요가 없습니다. 파이썬 3.4를 사용하고 있습니다.
# 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