LoginSignup
138
106

More than 1 year has passed since last update.

Python clickの案外知られていない機能

Last updated at Posted at 2021-12-19

Python clickの案外知られていない機能

Pythonにはclickというコマンドラインパーサとして使えるライブラリがあります。同様のライブラリとして以前からargparseがありますが、clickはargparseよりももっと簡単に使えるライブラリです。
clickでコマンドラインパーサを書く例は以下になります。

# main.py
import click

@click.command()
@click.option(
        "--count", 
        type=int,
        default=1,
        required=True,
        help="Number of greetings.",
)
@click.option(
        "--name", 
        type=str,
        default="Your name",
        required=True,
        help="The person to greet.",
)
def hello(
        count: int, 
        name: str,
):
        for _ in range(count):
                click.echo(f"Hello {name}!")

if __name__ == "__main__":
        hello()

これで以下のように実行することで引数を与えてプログラムを実行することができます。

$ python -m main --count 2 --name test
Hello test!
Hello test!

ここで注目したいのは click.echo(f"Hello {name}!") です。clickで標準出力しています。clickはコマンドラインパーサとしてargparseの代替と思われることが多いですが、実はその他にもいろいろ便利な機能が提供されています。本記事ではclickの知られざる便利な機能を紹介します。

標準出力 click.echo() click.secho() click.style() click. echo_via_pager()

clickで標準出力することができます。Pythonの標準出力であればprintがありますが、click.echo系の標準出力はいろいろ高機能です。

# click_echo.py
import click

def main():
        message="Hello World of 2021!"
        # 普通に標準出力
        click.echo(message)
        # エラーメッセージとして標準出力
        click.echo(message, err=True)
        # フォントの色を緑
        click.echo(click.style(message, fg="green"))
        # フォントの色を緑、バックグラウンドを青
        click.echo(click.style(message, fg="green", bg="blue"))
        # 太文字、下線を引く、フォント色とバックグラウンド色を反転
        click.echo(click.style(message,bold=True, underline=True, reverse=True))
        # 太文字、下線を引く、フォント色を緑、バックグラウンドを青にしてフォント色とバックグラウンド色を反転
        click.secho(message, bold=True, underline=True, reverse=True, fg="green", bg="blue")

if __name__ == "__main__":
        main()

python -m click_echo で実行すると以下のような結果になります。clickのコマンドラインパーサ機能と組み合わせてPythonでCLIを作る時にメッセージの表示で便利に使うことができます。

image.png

更にはpagerを加えて長い複数行の表示をスクロール表示することもできます。

# click_pager.py

import click

def main():
        click.echo_via_pager("\n".join(f"Line {idx}" for idx in range(100)))

if __name__ == "__main__":
        main()

これで複数行表示されたメッセージを↑↓やスペースキーで上下移動することができます。

image.png

表示操作 click.clear() click.pause()

clickではターミナルの表示を操作することもできます。

click.clear() で標準出力をクリア(clearコマンド)、click.pause()でキーボードが押されるまで停止することができます。

エディタやアプリケーションを開く click.edit() click.launch()

clickからエディタやアプリケーションを開くこともできます。
たとえばテキストファイル等を開く場合はclick.edit(filename="text.txt")で開いて直接編集することができます。これでターミナルでPythonでファイル操作中にファイルの内容を書き換えたい場合にいちいちPythonからquit()してエディタを開く必要はなくなります。
更にはclick.launch()でアプリケーションを開くこともできます。
たとえばclick.launch("https://qiita.com/advent-calendar/2021/python")を実行することで標準のWebブラウザで https://qiita.com/advent-calendar/2021/python が開きます。

image.png

その他にもファイルパスを指定することでそのファイルを開くこともできます。click.launch("./text.txt")で以下のようにファイルを開きます。

image.png

プログレスバー click.progressbar()

最後にプログレスバーです。click.progressbar()でプログレスバーを表示することができます。

# click_progress.py

import click
import time

with click.progressbar([1, 2, 3]) as bar:
        for x in bar:
                msg=f"sleep({x})..."
                click.echo(msg)
                time.sleep(x)
$ python -m click_progress
sleep(1)...
  [############------------------------]   33%  00:00:02sleep(2)...
  [########################------------]   66%  00:00:01sleep(3)...
  [####################################]  100%

まとめ

というわけでclickの知られざる便利な機能の紹介でした。
良いお年を〜。

138
106
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
138
106