web-dev-qa-db-fra.com

Comment quitter Python sans traceback?

J'aimerais savoir comment quitter Python sans créer de trace de trace sur la sortie.

Je souhaite toujours pouvoir renvoyer un code d'erreur, mais je ne souhaite pas afficher le journal de suivi.

Je veux pouvoir quitter avec exit(number) sans trace, mais en cas d'exception (pas de sortie), je veux la trace.

263
sorin

Vous rencontrez probablement une exception et le programme se ferme pour cette raison (avec une trace). La première chose à faire est donc d’attraper cette exception avant de quitter proprement (avec un message, 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 __== "__main__":
    main()
282
jkp

Peut-être essayez-vous d’attraper toutes les exceptions et cela intercepte l’exception SystemExit levé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 une exception est une mauvaise idée. Vous allez attraper 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 ridicule, à moins que vous ne fassiez 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 quitter sans lever SystemExit:

import os
os._exit(1)

Je le fais dans un code qui s'exécute sous unittest et appelle fork(). Unittest est obtenu lorsque le processus forké lève SystemExit. C'est définitivement un cas d'angle!

79
bstpierre
import sys
sys.exit(1)
45
Wojciech Bederski

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

10
rob

Le code suivant ne déclenchera pas d'exception et se fermera sans traceback:

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 compliquées.

8
IlliakaillI

Il est bien préférable d'éviter d'utiliser sys.exit () et de lever/gérer des exceptions pour permettre au programme de se terminer correctement. Si vous souhaitez désactiver le traçage, utilisez simplement:

sys.trackbacklimit=0

Vous pouvez définir ceci en haut de votre script pour écraser toutes les sorties de trace, mais je préfère l’utiliser avec plus de parcimonie, par exemple les "erreurs connues" pour lesquelles 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 intercepté, 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, nous obtenons toujours la sortie de trace complète.

5
RCross

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

4
Miled Louis Rizk

Je le ferais de cette façon:

import sys

def do_my_stuff():
    pass

if __== "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)
2
Karl W.

Qu'en est-il de

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

Pas de trace et plus explicite.

1
agcala