click.commandを使えば、コマンドのプログレスバーを簡単に実現できる。
少し感動した自分がいる。
click.commandとは
コマンドラインインタフェースを作成するためのPythonのパッケージ。
基本例
イテレータのデータを処理する場合、click.progressbar
に処理対象のイテレータ変数を渡す。
返却されたProgressBar
オプジェクトをfor文で処理する。
各要素は、click.progressbar
に渡したイレテータの要素になる。
import click import time def progress(): all_item = ["product1", "product2", "product3", "product4"] with click.progressbar(all_item) as bar: for item in bar: # product1, product2, prodcut3, product4 がくる time.sleep(3) if __name__ == '__main__': progress()
実行すると以下の表示される。
[##################------------------] 50% 00:00:06
labelパラメータを設定するとプログレスバーの前にラベルを表示できる。
with click.progressbar(all_item, label="プログレスバーだよ") as bar: for item in bar: time.sleep(3)
ラベルを付与したプログレスバーは以下のようになる。
プログレスバーだよ [#########---------------------------] 25%
進捗状況を意図した値で更新したい
イテレータを処理せずに、指定の値のプログレスを表示したい場合、length
に
サイズを指定する。
プログレスバーの更新は、update関数を実行し、進捗状況を更新する。
total_size = 1000 with click.progressbar(length=total_size) as bar: while True: bar.update(1) # 1が加算されていく count += 1 time.sleep(0.5) if count == total_size: break
プログレスバーのカスタマイズ
進捗状況の表示文字を変更
プログレスバーの進捗状況を表す文字をカスタマイズしたい場合、fill_char
パラメータを使用する。
残りの状況の箇所をカスタマイズしたい場合、empty_char
パラメータを使用する。
デフォルトだと、fill_char
パラメータは#
。empty_char
パラメータは、-
になる。
fill_char
パラメータを*
、empty_char
を(空白)にしてみる。
total_size = 20 with click.progressbar(fill_char="*", empty_char=" ", length=total_size) as bar: count = 0 while True: bar.update(1) count += 1 time.sleep(0.5) if count == total_size: break
進捗状況は*
で表示され、残りの状況は空白で置き換わっている。
[********************** ] 62% 00:00:12
プログレスバーの表示フォーマットを変更
プログレスバーの表示フォーマットのカスタマイズもできる。
デフォルトだと、%(label)s [%(bar)s] %(info)s
が設定されているので、barの枠を[]
から|
に変更してみる。
total_size = 20 with click.progressbar(fill_char="*", empty_char=" ", bar_template='%(label)s |%(bar)s| %(info)s', length=total_size) as bar: count = 0 while True: bar.update(1) count += 1 time.sleep(0.5) if count == total_size: break
barの枠が|
になっていることがわかる。
|************************************| 100%
そのほかにも、推定時間の有効/無効の設定、パーセント表示の有効/無効の設定もできる。
最後に
シェルスクリプトでプログレスバーを作ろうとすると手間がかかるし、処理も面倒なので作ろうと思わないが、このpythonのライブラリを使用すれば、簡単にプログレスバーが作れる。
こんなに簡単にプログレスバーが出来るなんて、少し感動した。