2016-05-05 35 views
5

有沒有辦法只顯示重要的目錄路徑執行python程序時?python3:不顯示完整的目錄路徑上的錯誤消息

目前,我得到這個:

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' 

因爲我知道在哪個目錄下我的代碼是,完整的目錄,使剛剛更糟可讀的錯誤消息。我可以告訴python向我展示更多這樣的輸出嗎?

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' 

回答

運用unutbu我添加了色彩的一些線路,萬一有人代碼尋找一種簡單的改進解釋輸出,只需用這個作爲模塊並導入它:

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

你能提供一個短暫的,完整的程序,產生一團糟這樣的年齡?我無法複製您的結果 - 我的所有回溯都會顯示「foo.py」,就像回溯的前兩行一樣。 –

+0

我所有的代碼都保存在同一個目錄中,因此任何示例都會在我的計算機上產生這種錯誤消息。我使用Ubuntu,python3,也許另一個操作系統使用不同的標準python解釋器。 – Jonas

回答

4

你可以指定一個自定義函數來sys.excepthookhandle all uncaught exceptions

sys.excepthook = my_excepthook 

那麼你可以使用

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

獲得回溯錯誤消息系序列,然後修改並可隨意打印。


例如,如果你想縮短所有文件路徑,只是它的基本名稱,你可以使用:

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() 

這將產生

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

ZeroDivisionError: division by zero 

,而不是

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

謝謝,覆蓋系統方法完美。我用你的代碼創建了自己的模塊。所以我只需要一行來導入這個模塊並且沒有代碼開銷。大! – Jonas

0

我認爲編寫自定義錯誤的最好方法是使用嘗試和除外。

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

你可以有一個try except塊周圍的main過程或在最高級別,如果你沒有一個main程序。在except塊中,可以使用traceback模塊解析異常跟蹤以刪除目錄名稱和其他不重要的信息。

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) 
相關問題