[英]Coloring exceptions from Python on a terminal
有沒有一種簡單的方法可以使異常消息在命令行上顯示顏色? 例如
def g(): f()
def f(): 1/0
g()
給出錯誤
Traceback (most recent call last):
File "test.py", line 3, in <module>
g()
File "test.py", line 1, in g
def g(): f()
File "test.py", line 2, in f
def f(): 1/0
ZeroDivisionError: integer division or modulo by zero
我希望在終端上對“ 整數除法或以零為模 ”進行着色或突出顯示,以便我可以快速地從長回溯中選擇它(僅限Linux)。 理想情況下,我不想為每個Exception編寫自定義類,而是以某種方式捕獲並格式化所有類型。
編輯:注釋中鏈接的問題提供了有關如何使用外部軟件解決問題的示例,但我對內部Python解決方案感興趣。
您可以將自定義函數分配給sys.excepthook
處理程序 。 每當有未處理的異常(因此退出解釋器的異常)時,都會調用該函數。
def set_highlighted_excepthook():
import sys, traceback
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import TerminalFormatter
lexer = get_lexer_by_name("pytb" if sys.version_info.major < 3 else "py3tb")
formatter = TerminalFormatter()
def myexcepthook(type, value, tb):
tbtext = ''.join(traceback.format_exception(type, value, tb))
sys.stderr.write(highlight(tbtext, lexer, formatter))
sys.excepthook = myexcepthook
set_highlighted_excepthook()
此版本使用pygments
庫將回溯文本轉換為使用ANSI着色格式的文本,然后再將其寫入stderr
。
有人將其變成了一個項目,該項目可以檢測終端支持並允許您設置pygments樣式,請參閱colored-traceback.py
。
找到了另一種使用IPython模塊執行此操作的方法,該模塊可能是每個人都已經安裝的依賴項:
from IPython.core.ultratb import ColorTB
c = ColorTB()
exc = sys.exc_info()
print(''.join(c.structured_traceback(*exc)))
看一下colorama (或任何其他着色)模塊。 然后,您可以使用以下方法包裝整個應用程序:
import traceback
from colorama import Fore, init
init( )
try:
// your app
except Exception:
print Fore.RED + traceback.format_exc( ) + Fore.RESET
// possibly raise again or log to db
這將共享@freakish解決方案,並使着色成為異常的一部分,而不是要求用戶為每個異常消息添加顏色。 顯然,它僅適用於自定義異常,因此它可能與OP所尋找的不完全相同。
from colorama import Fore, init
init()
class Error (Exception):
def __init__ (self, message):
super().__init__(Fore.RED + message)
class BadConfigFile (Error):
pass
raise BadConfigFile("some error message")
這將以紅色顯示“某些錯誤消息”的回溯。 將“錯誤”作為基類意味着您可以創建其他所有異常,這些異常都將繼承消息的顏色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.