Comment sortir de Python sans traceback?

je voudrais savoir comment sortir de Python sans avoir un dump traceback sur la sortie.

je veux toujours vouloir pouvoir retourner un code d'erreur mais je ne veux pas afficher le journal de traceback.

je veux pouvoir sortir en utilisant exit(number) sans trace mais en cas d'Exception (pas une sortie) je veux la trace.

235
demandé sur the Tin Man 2009-07-27 16:44:15

10 réponses

vous rencontrez probablement une exception et le programme quitte à cause de cela (avec un traceback). La première chose à faire est donc d'attraper cette exception, avant de sortir proprement (peut-être avec un message, exemple donné).

Essayez quelque chose comme ça dans votre main routine:

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()
262
répondu jkp 2012-06-30 19:48:53

peut-être essayez-vous D'attraper toutes les exceptions et c'est l'exception SystemExit soulevée par 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, utiliser except: sans nommer d'exception est une mauvaise idée. Vous attraperez toutes sortes de choses que vous ne voulez pas attraper -- comme SystemExit -- et cela peut aussi masquer vos propres erreurs de programmation. Mon exemple ci-dessus est stupide, à moins que vous ne fassiez quelque chose en termes de nettoyage. Vous pourriez le remplacer par:

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

si vous devez sortir sans augmenter SystemExit :

import os
os._exit(1)

je fais ça, en code qui passe sous unittest et appelle fork() . Unittest obtient lorsque le processus Fourché soulève SystemExit . C'est définitivement une affaire de coin!

72
répondu bstpierre 2016-07-01 08:12:54
import sys
sys.exit(1)
43
répondu Wojciech Bederski 2009-07-27 12:45:38

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

11
répondu Roberto Liffredo 2009-07-27 12:45:44

il est beaucoup plus pratique d'éviter d'utiliser sys.exit () et raise/handle exceptions pour permettre au programme de finir proprement. Si vous voulez désactiver traceback, utilisez simplement:

sys.trackbacklimit=0

vous pouvez régler cela en haut de votre script pour écraser toutes les sorties de traceback, mais je préfère l'utiliser de manière plus économe, par exemple "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 On L'Appelle Processerror est attrapé, 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 n'importe quelle autre erreur se produit, nous obtenons toujours la pleine production de traceback.

4
répondu RCross 2016-08-25 11:03:05

utilisez la fonction Python intégrée quit () et c'est tout. Pas besoin d'importer n'importe quelle bibliothèque. J'utilise python 3.4

3
répondu Miled Louis Rizk 2017-01-14 13:21:08

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)
2
répondu Karl W. 2014-10-07 22:27:04

le code suivant ne soulèvera pas d'exception et sortira sans un traceback:

import os
os._exit(1)

voir la question et les réponses connexes pour plus de détails. Je suis surpris que toutes les autres réponses soient si exagérées.

1
répondu IlliakaillI 2018-04-20 22:24:00

à propos

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

pas de traceback et plus explicite.

0
répondu agcala 2018-03-30 09:41:22
# 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
-8
répondu Brian Zimmerman 2014-06-23 23:39:49