首页 文章

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

提问于
浏览
239

我想知道如何退出Python而不在输出上有回溯转储 .

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

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

10 回答

  • 73

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

    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()
    
  • 4

    也许您正在尝试捕获所有异常,这是在捕捉 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: 而不命名异常是个坏主意 . 你想要 grab - 就像 SystemExit - 它也可以掩盖你自己的编程错误 . 我上面的例子很愚蠢,除非你在清理方面做些什么 . 您可以将其替换为:

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

    如果您需要退出而不提高 SystemExit

    import os
    os._exit(1)
    

    我这样做,在单元测试下运行的代码中调用 fork() . 当分叉进程引发 SystemExit 时,Unittest获取 . 这绝对是一个极端的案例!

  • 2
    import sys
    sys.exit(1)
    
  • 0

    import sys; sys.exit(0) 之类的东西?

  • 264

    避免使用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
    

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

  • -8

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

  • 2

    我会这样做:

    import sys
    
    def do_my_stuff():
        pass
    
    if __name__ == "__main__":
        try:
            do_my_stuff()
        except SystemExit, e:
            print(e)
    
  • 11

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

    import os
    os._exit(1)
    

    See this question and related answers了解更多详情 . 很惊讶为什么所有其他答案都如此过度简化 .

  • 3

    关于什么

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

    没有追溯和某种更明确的 .

  • 44
    # 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
    

相关问题