How to exit from Python without traceback?
我想知道如何在输出上不进行回溯转储的情况下退出python。
我仍然希望能够返回错误代码,但不希望显示跟踪日志。
我希望能够使用
您可能遇到了一个异常,因此程序正在退出(带有回溯)。因此,要做的第一件事就是在完全退出之前捕获该异常(可能带有一条消息,给出了一个示例)。
在你的
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() |
也许您试图捕获所有异常,而这正捕获
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 |
一般来说,使用
1 2 | import sys sys.exit(1) # Or something that calls sys.exit(). |
如果您需要退出而不提起
1 2 | import os os._exit(1) |
我这样做是在UnitTest下运行并调用
1 2 | import sys sys.exit(1) |
像
以下代码不会引发异常,将在没有跟踪的情况下退出:
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 |