14

コマンドラインで例外のメッセージを色付けする簡単な方法はありますか? 例えば

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 のみ)。理想的には、例外ごとにカスタム クラスを記述したくはありませんが、何らかの方法ですべての種類をキャッチしてフォーマットします。

編集:コメントにリンクされている質問には、外部ソフトウェアで問題を解決する方法の例が示されていますが、内部の Python ソリューションに興味があります。

4

4 に答える 4

19

カスタム関数をsys.excepthookhandlerに割り当てることができます。この関数は、未処理の例外 (つまり、インタープリターを終了する例外) があるたびに呼び出されます。

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

于 2013-02-08T16:09:05.200 に答える
2

colorama (またはその他の coloring ) モジュールを見てください。次に、アプリ全体を次のようにラップできます。

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
于 2013-02-08T15:48:29.083 に答える