![見出し画像](https://assets.st-note.com/production/uploads/images/27459430/rectangle_large_type_2_1f0f4b0a5b937c63093a616e60f4fe90.jpg?width=1200)
Python Tips: print() の代わりに rich.print() を使おう
こんにちは、けんにぃです。ナビタイムジャパンで公共交通の時刻表を使ったサービス開発やリリースフローの改善を担当しています。
今回は Python でコマンドラインツールを作るときに役立つライブラリとして Rich というものをご紹介したいと思います。
Rich とは
Rich はターミナルに出力するメッセージを簡単に整形したり色付けしたりすることができる pretty-print ライブラリです。
コマンドラインツールを作るときに色や書体が配慮されていると、情報にメリハリが付いて視認性が向上するので、ぜひオススメしたいライブラリとなっています。
インストール
まずは Rich をインストールします。
$ pip install rich
機能ごとに簡単な使い方を紹介していきます。
まずはメッセージ出力です。
#!/usr/bin/env python
from rich import print
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
![スクリーンショット 2020-06-04 13.43.57](https://assets.st-note.com/production/uploads/images/27460362/picture_pc_5bc0c0a0504585053083edcaa254b272.png?width=1200)
とてもカラフルですね。辞書が整形されて色付きで出力されていますが、Python のオブジェクトは rich.print() が自動で pretty-print してくれます。
テキストを色付けしたり書体を変えたりしたい場合は BBCode というマークアップ言語の形式で記述します。
例:
・[bold]太字[/bold]
・[red]赤色[/red]
・[u]下線[/u]
・[i]斜体[/i]
なお閉じタグは [/] と書いても大丈夫なようです。rich.print() は標準の print() と互換性があるので、入れ替えるのは簡単です。
絵文字の出力も可能です。
#!/usr/bin/env python
from rich import print
print(":dog: :cat: :rabbit:")
![スクリーンショット 2020-06-04 14.17.36](https://assets.st-note.com/production/uploads/images/27462379/picture_pc_5e6f40b107fe1b0c505371923b8b626e.png?width=1200)
Console
Console という機能を使ってもメッセージを出力できますが、print と違ってConsole はワードラップが有効になります。
#!/usr/bin/env python
from rich.console import Console
console = Console()
console.print("Hello, [bold red]World![/bold red]")
さらに console.log() という関数を使うとファイル名や行数なども含めたメッセージが出力できるようになります。
#!/usr/bin/env python
from rich.console import Console
console = Console()
def hello():
message1 = "Hello"
message2 = "World"
console.log(f"[red]{message1}[/], [cyan]{message2}![/]", log_locals=True)
hello()
![スクリーンショット 2020-06-04 14.45.22](https://assets.st-note.com/production/uploads/images/27464194/picture_pc_f08e6f746c9ceffd75c547f780c43d3d.png?width=1200)
console.log() に渡している log_locals という引数を True にすると、関数内で定義されたローカル変数を表形式で出力してくれます。
console.log() と同じ書式を Python 標準の logging モジュールでも使いたい場合は下記のようにします。
#!/usr/bin/env python
import logging
from rich.logging import RichHandler
logging.basicConfig(
level="NOTSET",
format="%(message)s",
datefmt="[%X]",
handlers=[RichHandler()],
)
logger = logging.getLogger("main")
logger.info("Hello, World!")
![スクリーンショット 2020-06-04 14.30.50](https://assets.st-note.com/production/uploads/images/27463194/picture_pc_40b583a398482db1ddf12833ce09123b.png?width=1200)
表の出力
Table を使うと表を出力することができます。下記のコードは virtualenv 内にあるディレクトリ .venv/lib/python3.6/site-packages 配下のファイルの一覧を表示するプログラムです。
#!/usr/bin/env python
from pathlib import Path
from rich.console import Console
from rich.table import Table
console = Console()
table = Table(show_header=True, header_style="bold magenta")
table.add_column("Name")
table.add_column("Attribute")
for path in Path(".venv/lib/python3.6/site-packages").glob("*"):
attr = "File" if path.is_file() else "Directory"
table.add_row(path.stem, attr)
console.print(table)
![スクリーンショット 2020-06-04 14.42.30](https://assets.st-note.com/production/uploads/images/27463978/picture_pc_767caa0b5a003600c51cd5fc53804441.png?width=1200)
進捗バー
progress は進捗バーを出力するための機能です。
#!/usr/bin/env python
import time
from rich.progress import track
for _ in track(range(100)):
time.sleep(0.1)
![スクリーンショット 2020-06-04 15.45.37](https://assets.st-note.com/production/uploads/images/27467986/picture_pc_0bdda1a646240072ca0b25601a48549f.png?width=1200)
コードハイライト
Syntax を使うとコードハイライトができるようになります。
#!/usr/bin/env python
from rich import print
from rich.syntax import Syntax
with open("main.py") as f:
print(Syntax(f.read(), "python"))
![スクリーンショット 2020-06-09 19.46.48](https://assets.st-note.com/production/uploads/images/27874501/picture_pc_a564e6bc253b58c52ee35a4ffb25c65d.png?width=1200)
Markdown も同様に色付けができますが Markdown という専用のクラスを使えば特別な装飾をしてくれます。
#!/usr/bin/env python
from rich import print
from rich.markdown import Markdown
with open("README.md") as f:
print(Markdown(f.read()))
コード内で読み込んでいる README.md が下記のような内容だとすると……
# Rich の導入
## インストール
```
$ pip install rich
```
## 使い方
```python
#!/usr/bin/env python
from rich import print
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
```
実行結果は次のようになります。
![スクリーンショット 2020-06-09 19.53.38](https://assets.st-note.com/production/uploads/images/27874943/picture_pc_2e3ddfbdcefe88efccdd1974fc47cb8f.png?width=1200)
バックトレース
例外が送出されたときに出てくるバックトレースもカラフルにできます。
#!/usr/bin/env python
from rich.traceback import install
install()
x = 10 / 0
print(x)
![スクリーンショット 2020-06-09 19.56.30](https://assets.st-note.com/production/uploads/images/27875170/picture_pc_d6fa101f703a7ae433331ae19866d802.png?width=1200)
さいごに
Rich の簡単な使い方をご紹介しました。ぜひコマンドラインツールの開発で活用してみてください。