ヒトリ歩き

愚痴とかいろいろ書きます

Pythonのclick.commandを利用して簡単にプログレスバーを作成

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%   

そのほかにも、推定時間の有効/無効の設定、パーセント表示の有効/無効の設定もできる。

click.palletsprojects.com

最後に

シェルスクリプトプログレスバーを作ろうとすると手間がかかるし、処理も面倒なので作ろうと思わないが、このpythonのライブラリを使用すれば、簡単にプログレスバーが作れる。
こんなに簡単にプログレスバーが出来るなんて、少し感動した。