簡體   English   中英

從終端上的Python着色異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM