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("")
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. –
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