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

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

Quiero poder salir usando exit(number)sin dejar rastro, pero en caso de una Excepción (no una salida) quiero el rastro.

respuesta

Presumiblemente, está encontrando una excepción y el programa se está cerrando debido a esto (con un rastreo). Por lo tanto, lo primero que debe hacer es capturar esa excepción, antes de salir limpiamente (tal vez con un mensaje, ejemplo dado).

Prueba algo como esto en tu mainrutina:

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

¿Quizás está tratando de capturar todas las excepciones y esto está capturando la SystemExitexcepción planteada por 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, usar except:sin nombrar una excepción es una mala idea. Capturará todo tipo de cosas que no desea capturar, como SystemExit, y también puede enmascarar sus propios errores de programación. Mi ejemplo anterior es tonto, a menos que esté haciendo algo en términos de limpieza. Podrías reemplazarlo con:

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

Si necesita salir sin subir SystemExit:

import os
os._exit(1)

Hago esto, en código que se ejecuta bajo unittest y llama a fork(). Unittest obtiene cuando el proceso bifurcado aumenta SystemExit. ¡Este es definitivamente un caso de esquina!

import sys
sys.exit(1)

El siguiente código no generará una excepción y saldrá sin rastrear:

import os
os._exit(1)

Consulte esta pregunta y las respuestas relacionadas para obtener más detalles. Sorprendido por qué todas las demás respuestas son tan complicadas.

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

Es una práctica mucho mejor evitar el uso de sys.exit() y, en su lugar, generar/manejar excepciones para permitir que el programa finalice limpiamente. Si desea desactivar el rastreo, simplemente use:

sys.trackbacklimit=0

Puede configurar esto en la parte superior de su secuencia de comandos para aplastar toda la salida de rastreo, pero prefiero usarlo con más moderación, por ejemplo, "errores conocidos" donde quiero que la salida esté limpia, por ejemplo, en el archivo 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."

Si se detecta CalledProcessError, la salida se verá así:

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

Si ocurre cualquier otro error, todavía obtenemos la salida de seguimiento completa.

Use la función incorporada de python quit() y eso es todo. No es necesario importar ninguna biblioteca. estoy usando python 3.4

Yo lo haría 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 rastro y de alguna manera más explícito.

# 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