美麗なコンソールアプリを手軽に作成! richライブラリを使ってみた
はじめに
こんにちは、@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は、マークアップをサポートしています。
from rich import print
print("[red]Hello[/red] [italic cyan]World[/italic cyan]!")
こんな感じになります。

角括弧の中にスタイルを書いて、囲むだけです。簡単!
スタイルは複数指定できます。
組み込みのprintを使いたい場合は、from rich import print as rich_print みたいな感じでインポートできます。
テーブルの出力
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()で行を追加できます。
機械学習とかでデータを表示するときに便利そうですね。
マークダウンの出力
from rich.markdown import Markdown
markdown_sample = """
# Hello, World!
This is a markdown text.
- list1
- list2
- list3
"""
markdown = Markdown(markdown_sample)
print(markdown)
こんな感じになります。

(...果たして使う機会はあるのか?)
オブジェクトのインスペクション
richは、オブジェクトのインスペクションをサポートしています。
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ですべての属性を表示します。
シンタックスハイライトされたコードの出力
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の出力
from rich.tree import Tree
tree = Tree("root")
tree.add("child1")
tree.add("child2").add("[red]grandchild[/red]")
print(tree)
こんな感じです。

ディレクトリ構造を表示するときに便利そうですね。
プロンプト機能
ユーザーが正しい入力をするまでループさせることができます。
from rich.prompt import Prompt
# 選択肢は自動で表示される。数が多くても表示されてしまうので注意
name = Prompt.ask("What is your name?",choices=["Alice","Bob","Charlie"])
print(f"Hello, {name}!")
Prompt.ask()には、defalultやchoicesなどの引数があります。

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

間違えたらもう一回表示する処理をいちいち書くのは面倒なので、ありがたいですね。
プログレスバーを表示する
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モジュールからの使用もサポートしています。
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