如何退出Python没有回溯?

我想知道如何从Python退出而不在输出上追踪转储。

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

我希望能够退出使用exit(number)无痕迹,但在例外(不是退出)的情况​​下,我想跟踪。

你大概会遇到一个exception,程序正在退出,因为这(跟踪)。 因此,要做的第一件事就是在完全退出之前(也许用一个消息,给出的例子)来捕捉这个exception。

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

也许你正试图捕捉所有的exception,这是捕捉由sys.exit()引发的SystemExitexception?

 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:没有命名exception是一个坏主意。 你会捕捉到所有你不想捕获的东西,比如SystemExit ,它也可以掩盖你自己的编程错误。 我上面的例子是愚蠢的,除非你正在做清理方面的东西。 您可以将其replace为:

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

如果您需要退出而不升级SystemExit

 import os os._exit(1) 

我这样做,在unit testing运行,并调用fork() 。 当分叉进程提升SystemExit时,Unittest会得到。 这绝对是一个angular落的情况!

 import sys sys.exit(1) 

import sys; sys.exit(0)东西import sys; sys.exit(0) import sys; sys.exit(0)

避免使用sys.exit()是更好的做法,而是引发/处理exception,以使程序完整地完成。 如果你想closures回溯,只需使用:

 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 def do_my_stuff(): pass if __name__ == "__main__": try: do_my_stuff() except SystemExit, e: print(e) 
 # 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 
Interesting Posts