问题:如何从Python退出而无需追溯?
我想知道如何在不对输出进行回溯转储的情况下退出Python。
我仍然希望能够返回错误代码,但是我不想显示回溯日志。
我希望能够exit(number)不使用跟踪而退出,但是如果发生异常(不是退出),我需要跟踪。
回答 0
您大概遇到了一个异常,因此程序正在退出(带有追溯)。因此,要做的第一件事是在干净退出之前捕获该异常(可能带有消息,给出示例)。
在您的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()回答 1
也许您正在尝试捕获所有异常,而这正在捕获由SystemExit引发的异常sys.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)我使用在unittest和call下运行的代码来执行此操作fork()。当分叉过程出现时,单元测试就会进行SystemExit。这绝对是一个极端的情况!
回答 2
import sys
sys.exit(1)回答 3
像import sys; sys.exit(0)什么?
回答 4
回答 5
最好避免使用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如果发生任何其他错误,我们仍将获得完整的追溯输出。
回答 6
使用内置的python函数quit()就是这样。无需导入任何库。我正在使用python 3.4
回答 7
我会这样:
import sys
def do_my_stuff():
    pass
if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)回答 8
关于什么
import sys
....
....
....
sys.exit("I am getting the heck out of here!")没有回溯,并且以某种方式更加明确。
回答 9
# 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
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

