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.
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()
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!
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.
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
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)
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.
à propos
import sys
....
....
....
sys.exit("I am getting the heck out of here!")
pas de traceback et 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