美麗なコンソールアプリを手軽に作成! 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