プログレスバーを表示するためのPythonライブラリ progressbar2を使ってみた

はじめに

Yoshipon氏の以下のツイートからprogressbar2の存在を知ったので、使ってみたということ。

インストール

pipでインストール可能。

progressbar2 · PyPI

テスト

まずは、こんなスクリプトを書いてみた。

# -*- coding: utf-8 -*-

from time import sleep

from progressbar import progressbar as prg

for i in prg(range(10), prefix="A demonstration", suffix="\n"):
    sleep(0.1)
    print(i)

ターミナル出力はこんな感じ(アニメーションを用意したい!)。

A demonstration  0% (0 of 10) |                                                                           | Elapsed Time: 0:00:00 ETA:  --:--:--
0
A demonstration 10% (1 of 10) |#######                                                                    | Elapsed Time: 0:00:00 ETA:   0:00:00
1
A demonstration 20% (2 of 10) |###############                                                            | Elapsed Time: 0:00:00 ETA:   0:00:00
2
A demonstration 30% (3 of 10) |######################                                                     | Elapsed Time: 0:00:00 ETA:   0:00:00
3
A demonstration 40% (4 of 10) |##############################                                             | Elapsed Time: 0:00:00 ETA:   0:00:00
4
A demonstration 50% (5 of 10) |#####################################                                      | Elapsed Time: 0:00:00 ETA:   0:00:00
5
A demonstration 60% (6 of 10) |#############################################                              | Elapsed Time: 0:00:00 ETA:   0:00:00
6
A demonstration 70% (7 of 10) |####################################################                       | Elapsed Time: 0:00:00 ETA:   0:00:00
7
A demonstration 80% (8 of 10) |############################################################               | Elapsed Time: 0:00:00 ETA:   0:00:00
8
A demonstration 90% (9 of 10) |###################################################################        | Elapsed Time: 0:00:00 ETA:   0:00:00
9
A demonstration100% (10 of 10) |##########################################################################| Elapsed Time: 0:00:01 Time:  0:00:01

シェルのリダイレクトを活用してテキストファイルにログとして残す場合はちょっと注意が必要である。 例えば、上記のスクリプトをdemo.pyとして保存して実行するならば、

python3 demo.py > log.txt 2>&1

と行った具合に標準出力と標準エラー出力を束ねるわけである。progressbarは標準エラー出力に向いているので。

redirect_stdout=Falseのとき(デフォルト)、log.txtの中身は

A demonstration  0% (0 of 10) |          | Elapsed Time: 0:00:00 ETA:  --:--:--
A demonstration 10% (1 of 10) |#         | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 20% (2 of 10) |##        | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 30% (3 of 10) |###       | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 40% (4 of 10) |####      | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 50% (5 of 10) |#####     | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 60% (6 of 10) |######    | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 70% (7 of 10) |#######   | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 80% (8 of 10) |########  | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration 90% (9 of 10) |######### | Elapsed Time: 0:00:00 ETA:   0:00:00
A demonstration100% (10 of 10) |#########| Elapsed Time: 0:00:01 Time:  0:00:01
0
1
2
3
4
5
6
7
8
9

となる(標準エラー出力と標準出力が分離しているものをリダイレクトで束ねたので、こういう見かけ)。

redirect_stdout=Trueのときは、スクリプトはこうなる(デフォルトではFalseなので明示的にTrueにする)。

# -*- coding: utf-8 -*-

from time import sleep

from progressbar import progressbar as prg

for i in prg(range(10), prefix="A demonstration", suffix="\n", redirect_stdout=True):
    sleep(0.1)
    print(i)

その際、log.txtの中身は

A demonstration  0% (0 of 10) |                                                                           | Elapsed Time: 0:00:00 ETA:  --:--:--
0                                                                                                                                                
A demonstration  0% (0 of 10) |                                                                           | Elapsed Time: 0:00:00 ETA:  --:--:--
1                                                                                                                                                
A demonstration 10% (1 of 10) |#######                                                                    | Elapsed Time: 0:00:00 ETA:   0:00:01
2                                                                                                                                                
A demonstration 20% (2 of 10) |###############                                                            | Elapsed Time: 0:00:00 ETA:   0:00:01
3                                                                                                                                                
A demonstration 30% (3 of 10) |######################                                                     | Elapsed Time: 0:00:00 ETA:   0:00:00
4                                                                                                                                                
A demonstration 40% (4 of 10) |##############################                                             | Elapsed Time: 0:00:00 ETA:   0:00:00
5                                                                                                                                                
A demonstration 50% (5 of 10) |#####################################                                      | Elapsed Time: 0:00:00 ETA:   0:00:00
6                                                                                                                                                
A demonstration 60% (6 of 10) |#############################################                              | Elapsed Time: 0:00:00 ETA:   0:00:00
7                                                                                                                                                
A demonstration 70% (7 of 10) |####################################################                       | Elapsed Time: 0:00:00 ETA:   0:00:00
8                                                                                                                                                
A demonstration 80% (8 of 10) |############################################################               | Elapsed Time: 0:00:00 ETA:   0:00:00
9                                                                                                                                                
A demonstration 90% (9 of 10) |###################################################################        | Elapsed Time: 0:00:01 ETA:   0:00:00
A demonstration100% (10 of 10) |##########################################################################| Elapsed Time: 0:00:01 Time:  0:00:01

となっており、 冒頭に示したターミナル上での実行と見かけは一緒になる(それはそう)。

深層学習系のスクリプトを回す時、エポック毎のlossを表示させながらprogressbarも出したい時、便利ではなかろうか。tqdmだとテキストファイルに出力したときに表示が崩れるので。

以上。