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.
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()
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!
import sys
sys.exit(1)
quelque chose comme import sys; sys.exit(0)
?
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.
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.
Utilisez la fonction intégrée python quit () et c'est tout. Pas besoin d'importer de bibliothèque. J'utilise python 3.4
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)
Qu'en est-il de
import sys
....
....
....
sys.exit("I am getting the heck out of here!")
Pas de trace et plus explicite.