Pregunta

Me gustaría saber cómo me sale de Python sin tener un volcado de rastreo en la salida.

Todavía quiero quiero ser capaz de devolver un código de error, pero no quiero para mostrar el registro de rastreo.

Quiero ser capaz de salir usando exit(number) sin dejar rastro, pero en el caso de una excepción (no una salida) Quiero que el rastro.

¿Fue útil?

Solución

Se le presumiblemente encontrando una excepción y el programa está saliendo debido a esto (con un rastreo). La primera cosa a hacer, por lo tanto es coger esa excepción, antes de salir limpiamente (tal vez con un mensaje, ejemplo dado).

Trate algo como esto en su rutina 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()

Otros consejos

Tal vez usted está tratando de capturar todas las excepciones y esto se captura la excepción planteada por 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

En general, el uso de except: sin nombrar a una excepción es una mala idea. Vas a coger todo tipo de cosas que no desea atrapar - como SystemExit - y también puede enmascarar sus propios errores de programación. Mi ejemplo anterior es tonto, a menos que usted está haciendo algo en términos de limpieza. Se podría reemplazarlo con:

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

Si necesita salir sin elevar SystemExit:

import os
os._exit(1)

Lo hago, en el código que se ejecuta bajo unittest y llama fork(). Unittest obtiene cuando el proceso en forma de horquilla levanta SystemExit. Esto es definitivamente un caso esquina!

import sys
sys.exit(1)

algo así como import sys; sys.exit(0)?

El siguiente código no elevará una excepción y se cerrará sin un rastreo:

import os
os._exit(1)

Ver esta pregunta y respuestas relacionadas para más detalles. Sorprendido por qué todas las demás respuestas son tan excesivamente complicada.

Es una práctica mucho mejor evitar el uso de sys.exit () y en lugar de subir / manejar excepciones para permitir que el programa termine de forma limpia. Si desea desactivar el rastreo, sólo tiene que utilizar:

sys.trackbacklimit=0

Es posible ajustar esta en la parte superior de su script para aplastar toda la salida de rastreo, pero yo prefiero usarlo con más moderación, por ejemplo, "los errores conocidos" en el que necesito que la salida sea limpio, por ejemplo, en el foo.py archivo:

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."

Si CalledProcessError es capturado, la salida tendrá el siguiente aspecto:

[me@test01 dev]$ ./foo.py
usage: uptime [-V]
    -V    display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1

Si se produce cualquier otro error, todavía conseguimos la salida de rastreo completo.

Utilice la función de Python incorporada quit () y eso es todo. No hay necesidad de importar cualquier biblioteca. Estoy usando Python 3.4

Me gustaría hacerlo de esta manera:

import sys

def do_my_stuff():
    pass

if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)

¿Qué pasa

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

Sin rastreo y de alguna manera más explícita.

# 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top