298

我想知道如何在没有输出回溯转储的情况下退出 Python。

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

我希望能够在exit(number)没有跟踪的情况下退出,但如果出现异常(不是退出),我想要跟踪。

4

10 回答 10

312

您可能遇到了异常,因此程序正在退出(带有回溯)。因此,首先要做的是在干净退出之前捕获该异常(可能带有消息,给出示例)。

在你的日常生活中尝试这样的事情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()
于 2009-07-27T13:10:40.270 回答
85

也许您正在尝试捕获所有异常,而这正在捕获由?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 下运行的代码中执行此操作并调用fork(). 当分叉进程引发时,单元测试会得到SystemExit。这绝对是一个极端案例!

于 2009-07-27T21:55:27.570 回答
49
import sys
sys.exit(1)
于 2009-07-27T12:45:38.690 回答
16

以下代码不会引发异常,并且会在没有回溯的情况下退出:

import os
os._exit(1)

有关更多详细信息,请参阅此问题和相关答案。很惊讶为什么所有其他答案都如此复杂。

于 2018-04-20T22:24:00.567 回答
9

import sys; sys.exit(0)什么?

于 2009-07-27T12:45:44.320 回答
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

如果发生任何其他错误,我们仍然会获得完整的回溯输出。

于 2016-08-25T11:03:05.910 回答
4

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

于 2017-01-14T13:21:08.953 回答
2

我会这样做:

import sys

def do_my_stuff():
    pass

if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)
于 2014-10-07T22:27:04.673 回答
0

关于什么

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

没有回溯,并且以某种方式更明确。

于 2018-03-30T09:41:22.267 回答
-9
# 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
于 2014-06-20T18:21:48.720 回答