如何在没有回溯的情况下退出python?

How to exit from Python without traceback?

我想知道如何在输出上不进行回溯转储的情况下退出python。

我仍然希望能够返回错误代码,但不希望显示跟踪日志。

我希望能够使用exit(number)退出而不进行跟踪,但在发生异常(而不是退出)时,我希望跟踪。


您可能遇到了一个异常,因此程序正在退出(带有回溯)。因此,要做的第一件事就是在完全退出之前捕获该异常(可能带有一条消息,给出了一个示例)。

在你的main程序中尝试类似的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()


也许您试图捕获所有异常,而这正捕获sys.exit()引发的SystemExit异常?

1
2
3
4
5
6
7
8
9
10
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,它还可以掩盖您自己的编程错误。我上面的例子很愚蠢,除非你在做一些清理方面的工作。您可以将其替换为:

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

如果您需要退出而不提起SystemExit

1
2
import os
os._exit(1)

我这样做是在UnitTest下运行并调用fork()的代码中。当分叉进程提升SystemExit时,UnitTest得到。这绝对是个不折不扣的案子!


1
2
import sys
sys.exit(1)

import sys; sys.exit(0)这样?


以下代码不会引发异常,将在没有跟踪的情况下退出:

1
2
import os
os._exit(1)

有关详细信息,请参阅此问题和相关答案。奇怪的是,为什么所有其他的答案都那么复杂。


最好避免使用sys.exit(),而是引发/处理异常以使程序能够干净地完成。如果要关闭回溯,只需使用:

1
sys.trackbacklimit=0

您可以在脚本顶部设置此选项,以挤压所有的回溯输出,但我更愿意更谨慎地使用它,例如"已知错误",我希望输出是干净的,例如在文件foo.py中:

1
2
3
4
5
6
7
8
9
10
11
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,则输出如下所示:

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

如果发生任何其他错误,我们仍然会得到完整的跟踪输出。


使用内置的python函数quit(),就这样。不需要导入任何库。我用的是python 3.4


我会这样做:

1
2
3
4
5
6
7
8
9
10
import sys

def do_my_stuff():
    pass

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

怎么样

1
2
3
4
5
import sys
....
....
....
sys.exit("I am getting the heck out of here!")

没有回溯,而且更加明确。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 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