我想知道如何退出 Python 而不在输出上进行回溯转储。

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

我希望能够使用退出 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()

其他提示

也许你想捕获所有异常,这是由追赶提出SystemExitsys.exit()例外呢?

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)

我做到这一点,在该下单元测试运行,并调用fork()代码。单元测试时,派生进程提出SystemExit得到。这绝对是一个角落的情况!

import sys
sys.exit(1)

就像是 import sys; sys.exit(0) ?

以下代码不会引发异常并且将退出而不进行回溯:

import os
os._exit(1)

查看这个问题和相关答案 更多细节。惊讶为什么所有其他答案都如此复杂。

这是更好的做法是避免使用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函数退出(),就是这样。 无需输入任何库。 我使用python 3.4

我会做这种方式:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top