Frage

Ich würde gerne wissen, wie ich Ausstieg aus Python, ohne auf der Ausgabe einen Traceback-Dump mit.

ich will noch will in der Lage sein, einen Fehlercode zurück, aber ich will nicht das Zurückverfolgungsprotokoll angezeigt werden soll.

Ich möchte in der Lage sein, mit exit(number) ohne Spur zu verlassen, aber im Fall einer Ausnahme (keinen Ausgang) Ich mag die Spur.

War es hilfreich?

Lösung

Sie stoßen vermutlich eine Ausnahme, und das Programm wird beendet, weil dieser (mit einem Rückverfolgungs). Das erste, was also zu tun ist, diese Ausnahme zu fangen, bevor sauber austritt (vielleicht mit einer Nachricht, Beispiel).

Versuchen Sie so etwas in Ihrer 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()

Andere Tipps

Vielleicht sind Sie versuchen, alle Ausnahmen zu fangen und diese holt die SystemExit Ausnahme von sys.exit() angehoben?

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

In der Regel unter Verwendung von except: ohne eine Ausnahme Namensgebung ist eine schlechte Idee. Sie werden alle möglichen Dinge fangen Sie nicht wollen, zu fangen - wie SystemExit - und es können auch eigene Programmierfehler maskieren. Mein Beispiel oben ist albern, wenn Sie etwas in Bezug auf die Bereinigung tun. Sie könnten ersetzen Sie es mit:

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

Wenn Sie zu verlassen brauchen, ohne SystemExit zu erhöhen:

import os
os._exit(1)

ich dies tun, in Code, läuft unter Unittest und fork() nennt. Unittest erhält, wenn die Gabel Prozess SystemExit aufwirft. Dies ist definitiv eine Ecke Fall!

import sys
sys.exit(1)

so etwas wie import sys; sys.exit(0)?

Der folgende Code wird nicht eine Ausnahme ausgelöst und ohne Rückverfolgungs verlassen wird:

import os
os._exit(1)

diese Frage und Antworten in Bezug für weitere Details. Überrascht, warum alle anderen Antworten so zu kompliziert sind.

Es ist viel besser Praxis mit sys.exit zu vermeiden () und stattdessen heben / handelten Ausnahmen, damit das Programm sauber zu beenden. Wenn Sie deaktivieren Zurückverfolgungs wollen, verwenden Sie einfach:

sys.trackbacklimit=0

Sie können an der Spitze des Skripts setzen diese alle Zurückverfolgungs Ausgabe Squash, aber ich ziehe es zu benutzen, sparsamer, zum Beispiel „bekannte Fehler“, wo ich die Ausgabe wollen sauber sein, z.B. in der Datei 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."

Wenn CalledProcessError gefangen wird, wird die Ausgabe wie folgt aussehen:

[me@test01 dev]$ ./foo.py
usage: uptime [-V]
    -V    display version
Process failed
subprocess.CalledProcessError: Command '['uptime', '--help']' returned non-zero exit status 1

Wenn ein anderer Fehler auftritt, wir immer noch die vollständige Zurückverfolgungs Ausgabe erhalten.

Mit dem integrierten Python-Funktion beenden () und das ist es. Keine Notwendigkeit, jede Bibliothek zu importieren. Ich verwende Python 3.4

Ich würde es auf diese Weise tun:

import sys

def do_my_stuff():
    pass

if __name__ == "__main__":
    try:
        do_my_stuff()
    except SystemExit, e:
        print(e)

Was ist

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

Nein Zurückverfolgungs und irgendwie deutlicher.

# 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top