Ich möchte wissen, wie ich Python beenden kann, ohne einen Traceback-Dump für die Ausgabe zu haben.
Ich möchte weiterhin einen Fehlercode zurückgeben können, aber das Traceback-Protokoll nicht anzeigen.
Ich möchte in der Lage sein, exit(number)
ohne Trace zu beenden, aber im Falle einer Ausnahme (kein Exit) möchte ich den Trace.
Antworten:
Vermutlich tritt eine Ausnahme auf und das Programm wird aus diesem Grund beendet (mit einem Traceback). Das erste, was Sie tun müssen, ist, diese Ausnahme abzufangen, bevor Sie sie sauber beenden (möglicherweise mit einer Meldung, Beispiel angegeben).
Versuchen Sie so etwas in Ihrer
main
Routine:quelle
except Exception:
bissys.exit(0)
einschließlich zu entfernen . Es ist bereits das Standardverhalten, einen Traceback für alle nicht behandelten Ausnahmen zu drucken und nach dem Ende des Codes zu beenden. Warum also das Gleiche manuell tun?sys.exit()
sollte für Programme verwendet werden.exit()
ist für interaktive Shells gedacht. Siehe Der Unterschied zwischen exit () und sys.exit () in Python? .Vielleicht versuchen Sie, alle Ausnahmen abzufangen, und dies fängt die
SystemExit
Ausnahme ab, die von ausgelöst wurdesys.exit()
?Im Allgemeinen ist die Verwendung
except:
ohne Benennung einer Ausnahme eine schlechte Idee. Sie werden alle Arten von Dingen fangen, die Sie nicht fangen möchten - wieSystemExit
- und es kann auch Ihre eigenen Programmierfehler maskieren. Mein Beispiel oben ist albern, es sei denn, Sie tun etwas in Bezug auf die Bereinigung. Sie könnten es ersetzen durch:Wenn Sie beenden müssen, ohne zu erhöhen
SystemExit
:Ich mache das in Code, der unter unittest läuft und aufruft
fork()
. Unittest wird, wenn der gegabelte Prozess ausgelöst wirdSystemExit
. Dies ist definitiv ein Eckfall!quelle
SystemExit
nur fangen, um anzurufensys.exit(e)
? Das Entfernen beider Zeilen hat den gleichen Effekt. Auch Bereinigung gehörtfinally:
nicht dazuexcept Exception: ... raise
.quelle
so etwas wie
import sys; sys.exit(0)
?quelle
Der folgende Code löst keine Ausnahme aus und wird ohne Traceback beendet:
Weitere Informationen finden Sie in dieser Frage und den zugehörigen Antworten . Überrascht, warum alle anderen Antworten so kompliziert sind.
quelle
Es ist viel besser, die Verwendung von sys.exit () zu vermeiden und stattdessen Ausnahmen auszulösen / zu behandeln, damit das Programm sauber beendet werden kann. Wenn Sie den Traceback deaktivieren möchten, verwenden Sie einfach:
Sie können dies oben in Ihrem Skript festlegen, um alle Traceback-Ausgaben zu quetschen. Ich bevorzuge es jedoch, es sparsamer zu verwenden, z. B. "bekannte Fehler", bei denen die Ausgabe sauber sein soll, z. B. in der Datei foo.py:
Wenn CalledProcessError abgefangen wird, sieht die Ausgabe folgendermaßen aus:
Wenn ein anderer Fehler auftritt, erhalten wir immer noch die vollständige Traceback-Ausgabe.
quelle
sys.trackbacklimit
in Python 3 finden Sie in dieser Antwort .Verwenden Sie die integrierte Python-Funktion quit () und fertig. Sie müssen keine Bibliothek importieren. Ich benutze Python 3.4
quelle
Ich würde es so machen:
quelle
Wie wäre es mit
Kein Traceback und irgendwie expliziter.
quelle
quelle