我想知道如何在退出Python时不在输出中生成回溯转储。我仍然希望能够返回错误代码,但我不想显示回溯日志。我想使用
exit(number)
退出,但如果发生异常(而不是退出),则需要跟踪。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)
的代码行,包括这两行。对于所有未处理的异常,默认行为已经是打印回溯信息并在代码结束后退出,因此手动执行相同操作是多余的。 - MestreLion也许你试图捕获所有异常,但这里却捕获了由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 就会获取到它。这绝对是一个边角情况!
SystemExit
,只是为了调用sys.exit(e)
?删除这两行代码会产生同样的效果。此外,清理工作应该属于finally:
部分,而不是except Exception: ... raise
. - MestreLionimport sys
sys.exit(1)
import os
os._exit(1)
查看此问题及相关答案以获取更多细节。惊讶于为什么所有其他答案都过于复杂。
这种方法也不能进行适当的清理,例如调用清理处理程序、刷新stdio缓冲区等(感谢pabouk指出这一点)。
类似于 import sys; sys.exit(0)
的东西吗?
最好的实践是避免使用sys.exit(),而是使用raise/handle异常来让程序能够干净地结束。如果你想关闭追踪回溯(traceback),只需使用:
sys.trackbacklimit=0
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
stderr
,而不是stdout
。使用以下代码:print("Process failed", file=sys.stderr)
。 - pabouk - Ukraine stay strong使用内置的python函数quit()即可完成,无需导入任何库。我正在使用Python 3.4版本。
quit()
或 exit()
。这些函数仅适用于交互式 Python。请参阅 Python 退出命令 - 为什么有这么多,每个应该在何时使用? 您可以使用 sys.exit()
或 raise SystemExit
替代。 - pabouk - Ukraine stay strong我会这样做:
import sys
def do_my_stuff():
pass
if __name__ == "__main__":
try:
do_my_stuff()
except SystemExit, e:
print(e)
关于什么呢?
import sys
....
....
....
sys.exit("I am getting the heck out of here!")
没有追踪信息,但更加明确。
# 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