Domanda

Vorrei sapere come mi uscire da Python senza avere una discarica traceback sull'uscita.

ho ancora voglia voglio essere in grado di restituire un codice di errore, ma non voglio che per visualizzare il registro traceback.

Voglio essere in grado di uscire con exit(number) senza lasciare traccia, ma in caso di eccezione (non un'uscita) Voglio la traccia.

È stato utile?

Soluzione

Hai presumibilmente verificato un'eccezione e il programma sta uscendo causa di questo (con un traceback). La prima cosa da fare quindi è quello di catturare tale eccezione, prima di uscire in modo pulito (forse con un messaggio, esempio dato).

Prova qualcosa di simile nella vostra 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 __name__ == "__main__":
    main()

Altri suggerimenti

Forse stai cercando di catturare tutte le eccezioni e questo sta prendendo piede l'eccezione sollevata da SystemExit 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

In generale, utilizzando except: senza nominare un'eccezione è una cattiva idea. Ti cattura tutti i tipi di cose che non si desidera per la cattura - come SystemExit - e può anche mascherare i propri errori di programmazione. Il mio esempio di cui sopra è stupido, a meno che non si sta facendo qualcosa in termini di pulizia. Si potrebbe sostituirlo con:

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

Se avete bisogno di uscire senza alzare SystemExit:

import os
os._exit(1)

Lo faccio, nel codice che gira sotto unittest e chiama fork(). Unittest ottiene quando il processo biforcuta solleva SystemExit. Questo è sicuramente un caso d'angolo!

import sys
sys.exit(1)

qualcosa di simile import sys; sys.exit(0)?

Il seguente codice non solleverà un'eccezione e uscirà senza un traceback:

import os
os._exit(1)

Vedere questa domanda e le risposte relative per maggiori dettagli. Sorpreso perché tutte le altre risposte sono così troppo complicata.

E 'molto meglio pratica per evitare di usare sys.exit () e invece aumentare / gestire le eccezioni per consentire al programma di terminare in modo pulito. Se si desidera disattivare traceback, utilizzare semplicemente:

sys.trackbacklimit=0

È possibile impostare questa nella parte superiore del vostro script di schiacciare tutto l'output di traceback, ma io preferisco usare più parsimonia, ad esempio "errori noti" dove voglio l'uscita per essere pulito, per esempio nel file 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."

Se CalledProcessError 'colto, l'output sarà simile a questa:

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

Se si verifica qualsiasi altro errore, abbiamo ancora ottenere l'output completo traceback.

Utilizzare la funzione built-in pitone quit () e il gioco è fatto. Non c'è bisogno di importare qualsiasi libreria. Sto usando python 3.4

Vorrei fare in questo modo:

import sys

def do_my_stuff():
    pass

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

Che dire

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

No traceback e in qualche modo più esplicito.

# 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top