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

我想知道如何退出Python而不对输出进行跟踪转储。

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

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

649064 次浏览
import sys
sys.exit(1)

类似import sys; sys.exit(0) ?

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

在你的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()

也许你正在尝试捕获所有异常,而这正在捕获由sys.exit()引发的SystemExit异常?

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()。当fork进程引发SystemExit时,Unittest得到。这绝对是个特例!

# 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

我会这样做:

import sys


def do_my_stuff():
pass


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

更好的做法是避免使用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

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

使用内置的python函数quit()就可以了。 不需要导入任何库。 我使用python 3.4

是什么

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

没有追溯,而且更明确。

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

import os
os._exit(1)

请看这个问题和相关答案获取更多详细信息。很惊讶为什么其他答案都这么复杂。

这也不会进行适当的清理,如调用清理处理程序,刷新stdio缓冲区等(感谢pabouk指出这一点)。