2016-05-05 14 views
5

nicht anzeigen Gibt es eine Möglichkeit, nur die wichtigen Verzeichnispfade beim Ausführen eines Python-Programms anzuzeigen?python3: Vollständiger Verzeichnispfad bei Fehlermeldung

Derzeit bekomme ich diese:

python3 foo.py           
Traceback (most recent call last): 
    File "foo.py", line 60, in <module> 
    foo = Foo() 
    File "foo.py", line 22, in __init__ 
    self._run() 
    File "/media/MyDocuments/xxxxxxx/yyyyyyyyy/python_code/foo.py", line 18, in check_input 
    bar = obj.get_action() 
AttributeError: 'obj' object has no attribute 'get_action' 

Wie ich in welchem ​​Verzeichnis meines Code wissen ist, das vollständige Verzeichnis der Fehlermeldung nur schlechter lesbar macht. Kann ich Python sagen, dass er mir die Ausgabe lieber so zeigt?

python3 foo.py           
    Traceback (most recent call last): 
     File "foo.py", line 60, in <module> 
     foo = Foo() 
     File "foo.py", line 22, in __init__ 
     self._run() 
     File ".../foo.py", line 18, in check_input 
     bar = obj.get_action() 
    AttributeError: 'obj' object has no attribute 'get_action' 

Antwort

Verwenden Sie den Code aus unutbu ich ein paar Zeilen für Farben hinzugefügt, falls jemand sucht nach einem leichten Verbesserung des Interpreters Ausgang, dies nur als ein verwenden Modul und importieren Sie es:

import sys 
import traceback 
import os 
import re 

RED = '\033[91m' 
GREEN = '\033[92m' 
YELLOW = '\033[93m' 
LIGHT_PURPLE = '\033[94m' 
PURPLE = '\033[95m' 
CYAN = '\033[96m' 
END = '\033[0m' 

def my_excepthook(type, value, tb): 
    lines = traceback.format_list(traceback.extract_tb(tb)) 
    def shorten(match): 
     return 'File "{}"'.format(os.path.basename(match.group(1))) 
    lines = [re.sub(r'File "([^"]+)"', shorten, line) for line in lines] 
    _print_color(lines) 
    # print(''.join(lines)) 
    print(RED + '{}: {}'.format(type.__name__, value) + END) 

sys.excepthook = my_excepthook 


def _print_color(lines): 
    for l in lines: 
     for i in range(len(l)-1): 
      if l[i:i+5]=="line ": 
       i +=5 
       # Find the length of the number 
       numLen = 0 
       while l[i+numLen].isdigit(): 
        numLen +=1 

       # Find the length of the function 
       funLen = 0 
       while not l[i+numLen+4 + funLen]=="\n": 
        funLen+=1 

       l = ''.join([l[:i], 
         YELLOW+"{}".format(l[i:i+numLen])+END, 
         l[i+numLen:i+numLen+5], 
         LIGHT_PURPLE+"{}".format(l[i+numLen+5:i+numLen+5+funLen])+END, 
         CYAN+"{}".format(l[i+numLen+5+funLen:])+END]) 
       print(l,end="") 
       break 
    print("") 
+1

Können Sie ein kurzes, vollständiges Programm erstellen, das Unordnung verursacht Alter so? Ich kann deine Ergebnisse nicht reproduzieren - alle meine Rückverfolgungen sagen "foo.py", genau wie die ersten beiden Zeilen deines Tracebacks. –

+0

Mein gesamter Code wird im selben Verzeichnis gespeichert, daher würde jedes Beispiel eine solche Fehlermeldung auf meinem Computer erzeugen. Ich benutze Ubuntu, python3, vielleicht benutzt ein anderes Betriebssystem einen anderen Standard-Python-Interpreter. – Jonas

Antwort

4

Sie können eine benutzerdefinierte Funktion zu sys.excepthook zuweisen handle all uncaught exceptions:

sys.excepthook = my_excepthook 

Dazu

def my_excepthook(type, value, tb): 
    lines = traceback.format_list(traceback.extract_tb(tb)) 
    # process/modify lines 
    print(''.join(lines)) 

verwenden könnte die Zurückverfolgungsfehlermeldung als eine Folge von Linien zu erhalten, dann modifiziert und gedruckt wie du willst.


Zum Beispiel, wenn Sie alle Dateipfade verkürzen möchte nur seine Basisnamen, könnten Sie verwenden:

import sys 
import traceback 
import os 
import re 

def my_excepthook(type, value, tb): 
    lines = traceback.format_list(traceback.extract_tb(tb)) 
    def shorten(match): 
     return 'File "{}"'.format(os.path.basename(match.group(1))) 
    lines = [re.sub(r'File "([^"]+)"', shorten, line, 1) for line in lines] 
    print(''.join(lines)) 
    print('{}: {}'.format(type.__name__, value)) 

sys.excepthook = my_excepthook # comment this out to see the difference 

class Foo(): 
    def run(self): 
     1/0 

foo = Foo() 
foo.run() 

die liefert

File "script.py", line 24, in <module> 
    foo.run() 
    File "script.py", line 21, in run 
    1/0 

ZeroDivisionError: division by zero 

statt

Traceback (most recent call last): 
    File "/home/unutbu/pybin/script.py", line 24, in <module> 
    foo.run() 
    File "/home/unutbu/pybin/script.py", line 21, in run 
    1/0 
ZeroDivisionError: division by zero 
+1

Danke, das Überschreiben der Systemmethode funktioniert einwandfrei. Ich habe mein eigenes Modul mit Ihrem Code erstellt. Also brauche ich nur eine Zeile, um dieses Modul zu importieren und keinen Code-Overhead zu haben. Groß! – Jonas

0

Ich denke, der beste Weg, benutzerdefinierte Fehler zu schreiben ist zu verwenden versuchen und außer.

try: 
    doSomething() # You code goes here. 
except Exception: 
    # Whatever you want to be shown, full path, anything. 
    pass 
0

können Sie haben einen try except Block um Ihre main Verfahren oder der obersten Ebene an, wenn Sie nicht über eine main Routine. Im Block except können Sie die Ausnahmespuren analysieren, um den Verzeichnisnamen und andere nicht wichtige Informationen mit dem Modul traceback zu entfernen.

import traceback 
import sys 
if __name__ == '__main__': 
    try: 
     #SomeOperation 
     #More operation 
    except: 
     errorMsg = traceback.format_exc() 
     #Format error message according to your preference 
     print(errorMsgTransformed) 
     sys.exit(1) 
Verwandte Themen