トレースバック

Richは、Pythonのトレースバックを構文強調とフォーマットでレンダリングできます。Richのトレースバックは、標準のPythonトレースバックよりも読みやすく、より多くのコードを表示します。

Richのトレースバックの例を見るには、次のコマンドを実行します

python -m rich.traceback

トレースバックの出力

print_exception()メソッドは、現在処理中の例外のトレースバックを出力します。以下に例を示します

from rich.console import Console
console = Console()

try:
    do_something()
except Exception:
    console.print_exception(show_locals=True)

show_locals=Trueパラメータを指定すると、Richはトレースバックの各フレームのローカル変数の値を表示します。

より大きな例については、exception.pyを参照してください。

トレースバックハンドラー

Richは、デフォルトのトレースバックハンドラーとしてインストールして、キャッチされないすべての例外を強調表示してレンダリングできます。方法は次のとおりです

from rich.traceback import install
install(show_locals=True)

トレースバックハンドラーを設定するためのいくつかのオプションがあります。詳細については、install()を参照してください。

自動トレースバックハンドラー

場合によっては、モジュールにコードをインポートすることを気にせずに、トレースバックハンドラーを自動的にインストールしたい場合があります。これは、仮想環境のsitecustomize.pyを変更することで行うことができます。通常、これは仮想環境パスのsite-packagesフォルダーの下にあります。次のようなものです。

./.venv/lib/python3.9/site-packages/sitecustomize.py

ほとんどの場合、このファイルは存在しません。存在しない場合は、次のようにして作成できます。

$ touch .venv/lib/python3.9/site-packages/sitecustomize.py

次のコードをファイルに追加します。

from rich.traceback import install
install(show_locals=True)

この時点で、仮想環境内で実行されるすべてのコードに対してトレースバックがインストールされます。

注意

コードを共有する場合は、トレースバックのインストールをメインのエントリーポイントモジュールに含めるのがおそらく最善です。

フレームの抑制

(click、djangoなど)フレームワークを使用している場合、トレースバック内で自分のアプリケーションからのコードのみを表示することに関心がある場合があります。TracebackinstallConsole.print_exception、およびRichHandlersuppress引数を設定して、フレームワークコードを除外できます。これらはモジュールまたは文字列パスのリストである必要があります。

Richの例外からclickを除外する方法は次のとおりです。

import click
from rich.traceback import install
install(suppress=[click])

抑制されたフレームには、コードなしで、行とファイルのみが表示されます。

最大フレーム数

再帰エラーは、レンダリングに時間がかかり、多くの反復フレームを含む非常に大きなトレースバックを生成する可能性があります。Richは、デフォルトで100であるmax_frames引数を使用してこれを防ぎます。トレースバックに100を超えるフレームが含まれている場合、最初の50フレームと最後の50フレームのみが表示されます。max_framesを0に設定すると、この機能を無効にできます。

再帰エラーを出力する例を次に示します。

from rich.console import Console


def foo(n):
    return bar(n)


def bar(n):
    return foo(n)


console = Console()

try:
    foo(1)
except Exception:
    console.print_exception(max_frames=20)