🎨

美麗なコンソールアプリを手軽に作成! richライブラリを使ってみた

2023/08/04に公開

はじめに

こんにちは、@nano_sudoです!
PythonでCLIアプリを作るとき、カッコいい出力をしたいと思うことがありませんか?
でもANSIのエスケープシーケンスとかpprintとかいちいち書くはの面倒ですよね。
そんなときに便利なのが、richです。
ということで、今回はrichを使ってみたので、紹介していきたいと思います。

richとは

richは、PythonでCLIアプリを作るときに出力を装飾するためのライブラリです。
以下はrich公式ドキュメントの説明です。

Rich is a Python library for writing rich text (with color and style) to the terminal, and for displaying advanced content such as tables, markdown, and syntax highlighted code.
(Richは、ターミナルに色やスタイルを付けたり、テーブルやマークダウン、シンタックスハイライトされたコードなどの高度なコンテンツを表示したりするためのPythonライブラリです。)

Use Rich to make your command line applications visually appealing and present data in a more readable way. Rich can also be a useful debugging aid by pretty printing and syntax highlighting data structures.
(Richを使うと、コマンドラインアプリケーションを視覚的に魅力的にし、データをより読みやすい方法で表示できます。Richは、データ構造をきれいに印刷したり、構文をハイライトしたりすることで、デバッグの助けになることもあります。)

richでできること

  • マークアップによる装飾
  • テーブルの出力
  • マークダウンの出力
  • シンタックスハイライトされたコードの出力
  • loggingハンドラとしての使用(リッチなトレースバックや、ログでのマークアップ)
  • その他多数...

richのインストール

richは、pipでインストールできます。

pip install rich

richの使い方

マークアップ

richは、マークアップをサポートしています。

markup.py
from rich import print

print("[red]Hello[/red] [italic cyan]World[/italic cyan]!")

こんな感じになります。

角括弧の中にスタイルを書いて、囲むだけです。簡単!
スタイルは複数指定できます。
組み込みのprintを使いたい場合は、from rich import print as rich_print みたいな感じでインポートできます。

テーブルの出力

table.py
from rich.table import Column, Table

console = Console()

# テーブルの紹介
table = Table(show_header=True, header_style="bold magenta",title="ToDos")
table.add_column("Date", style="dim", width=12)
table.add_column("Title")
table.add_column("Tags", justify="right")
table.add_row("2021-08-01", "Finish rich tutorial", "python,rich")
table.add_row("2021-08-02", "Write article", "python,rich")

print(table)

こんな感じになります。

table = Table()でテーブルを作成して、table.add_column()で列を追加していきます。
Table()には、show_headerでヘッダーを表示するかどうか、header_styleでヘッダーのスタイル、titleでタイトルを指定できます。

add_column()には、styleでスタイル、widthで幅を指定できます。
add_row()で行を追加できます。

機械学習とかでデータを表示するときに便利そうですね。

マークダウンの出力

markdown.py
from rich.markdown import Markdown

markdown_sample = """
# Hello, World!

This is a markdown text.

- list1
- list2
- list3
"""

markdown = Markdown(markdown_sample)
print(markdown)

こんな感じになります。

(...果たして使う機会はあるのか?)

オブジェクトのインスペクション

richは、オブジェクトのインスペクションをサポートしています。

inspect.py
from rich import inspect

data = {
    "name": "Alice",
    "age": 20,
    "hobbies": ["programming", "reading"]
}

inspect(data)

引数

  • methods[bool]
    Trueでメソッドを表示します。
  • help[bool]
    Trueで完全な(省略されていない)ヘルプを表示します。
  • private[bool]
    Trueでプライベート属性(アンダースコアで始まる)を表示します。
  • dunder[bool]
    Trueでダブルアンダースコアで始まる属性を表示します。
  • all[bool]
    Trueですべての属性を表示します。

シンタックスハイライトされたコードの出力

code.py
from rich.console import Console
from rich.syntax import Syntax

console = Console()

python_code = """
def hello():
    print("Hello, World!")
"""

console.print(Syntax(python_code, "python", theme="monokai", line_numbers=True))

こんな感じになります。

スクリプトファイルの中身を表示するときに便利そうですね。

treeの出力

tree.py
from rich.tree import Tree

tree = Tree("root")
tree.add("child1")
tree.add("child2").add("[red]grandchild[/red]")

print(tree)

こんな感じです。

ディレクトリ構造を表示するときに便利そうですね。

プロンプト機能

ユーザーが正しい入力をするまでループさせることができます。

prompt.py
from rich.prompt import Prompt

# 選択肢は自動で表示される。数が多くても表示されてしまうので注意
name = Prompt.ask("What is your name?",choices=["Alice","Bob","Charlie"]) 
print(f"Hello, {name}!")

Prompt.ask()には、defalultchoicesなどの引数があります。

この場合、AliceBobCharlie以外を入力すると怒られて、正しい入力をするまで、再度入力を求められます。↓

間違えたらもう一回表示する処理をいちいち書くのは面倒なので、ありがたいですね。

プログレスバーを表示する

progress.py
from rich.progress import track
from time import sleep # デモ用

for i in track(range(100)):
    sleep(0.1)

こんな感じになります。

完了すると棒が緑色になります。
使い方は、for i in track(range(100)):のように、trackで囲むだけです。
なんとETA(残り時間)も表示してくれます!便利だね!

loggingモジュールからの使用

richは、loggingモジュールからの使用もサポートしています。

logging.py
import logging
from rich.logging import RichHandler

FORMAT = "%(message)s"
logging.basicConfig(
    level="NOTSET", format=FORMAT, datefmt="[%X]", handlers=[RichHandler(markup=True,rich_tracebacks=True)]
)

log = logging.getLogger("rich")
log.info("Hello, World!")

画面の右端にどこからログが出力されたかが表示されます。これがないと、どこからログが出力されたかわからないので、便利ですね。
RichHandler()markup引数で、マークアップを有効にできます。また、rich_tracebacks引数で、トレースバックをかっこよく表示できます。

まとめ

お疲れ様でした!
こんなにお手軽にかっこいい出力を実現できるのは、pythonプログラマーにとっては嬉しいですよね。
意外と知られていないので、知っていると差がつくかもしれません。
アプリを作りたいけど、GUIやWebアプリはちょっと...という人にもおすすめです。
今回紹介したのは、ほんの一部ですので、詳しい使い方は、公式ドキュメントをご覧ください。
質問やご意見・ご指摘などあれば、Xかコメント欄にお願いします!

Discussion