Comment sortir de Python sans retraçage?
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.
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