Question

Je voudrais savoir comment je quitte Python sans avoir une décharge de retraçage sur la sortie.

Je veux encore veux être en mesure de retourner un code d'erreur, mais je ne veux pas afficher le journal de retraçage.

Je veux être en mesure de sortir à l'aide exit(number) sans laisser de traces, mais dans le cas d'une exception (pas de sortie) Je veux la trace.

Était-ce utile?

La solution

Vous rencontrez sans doute une exception et le programme est sortie à cause de cela (avec un retraçage). La première chose à faire est donc d'attraper cette exception, avant de sortir proprement (peut-être un message, par exemple donné).

Essayez quelque chose comme ceci dans votre routine 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()

Autres conseils

Peut-être que vous essayez d'attraper toutes les exceptions et cela est attrapant l'exception soulevée par 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 général, à l'aide except: sans nommer une exception est une mauvaise idée. Vous allez attraper toutes sortes de choses que vous ne voulez pas attraper - comme SystemExit - et il peut également masquer vos propres erreurs de programmation. Mon exemple ci-dessus est stupide, à moins que vous faites quelque chose en termes de nettoyage. Vous pouvez le remplacer par:

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

Si vous devez sortir sans élever SystemExit:

import os
os._exit(1)

Je le fais, dans le code qui fonctionne sous unittest et appelle fork(). Unittest obtient lorsque le processus fourchue soulève SystemExit. C'est certainement un cas d'angle!

import sys
sys.exit(1)

quelque chose comme import sys; sys.exit(0)?

Le code suivant ne déclenche pas d'exception et quittera sans retraçage:

import os
os._exit(1)

Voir cette question et les réponses connexes pour plus de détails. Surpris pourquoi toutes les autres réponses sont si overcomplicated.

Il est préférable d'éviter d'utiliser la pratique sys.exit () et au lieu lever / gérer les exceptions pour permettre au programme de terminer proprement. Si vous souhaitez désactiver retraçage, utilisez simplement:

sys.trackbacklimit=0

Vous pouvez définir ce en haut de votre script pour écraser toutes les sorties de retraçage, mais je préfère l'utiliser avec parcimonie, par exemple « les erreurs connues » où je veux que la sortie soit propre, par exemple dans le fichier 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 CalledProcessError est pris, la sortie ressemblera à ceci:

[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 une autre erreur se produit, on obtient toujours la sortie complète de retraçage.

Utilisez la fonction python intégré quit () et c'est tout. Pas besoin d'importer une bibliothèque. J'utilise python 3.4

Je le ferais de cette façon:

import sys

def do_my_stuff():
    pass

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

Qu'en est-

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

Non retraçage et en quelque sorte plus explicite.

# 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top