計算の進行状況を stdout に表示するには、 progressbarモジュールを使用できます。
例:
import time
import progressbar
maxval = 100
pbar = progressbar.ProgressBar(maxval=maxval)
pbar.start()
for i in range(maxval):
# do something
time.sleep(0.05)
pbar.update(i+1)
pbar.finish()
出力:
$ python test.py
52% |##################################### |
ファイルへの出力の取得に関しては、出力を表示するためにファイルを閉じる必要はありませんが、出力バッファーをフラッシュする必要があります。(実際、ループの本体でファイルを繰り返し開いたり、切り捨てたりするのは非効率的であり、おそらく逆効果です。)
ファイル オブジェクトのフラッシュと、ファイルの内容をディスクにフラッシュするための os モジュールの fsyncメソッドを見てください。ただし、これは通常は必要ありません。ファイルに十分なデータを書き込むと、バッファは端末に出力できる速さでフラッシュされます。(通常tail -f progess_file
は問題なく出力できます。)
達成したいことをログに記録している場合は、logging モジュールを見てください。これを使用して、拡張可能な優れたロギング システムを取得できます。ファイルまたは stdout へのロギングをコード内の 1 点で行うかどうかを選択できます。メインロガーを名前で「取得」するだけで、他のモジュールのロギングアクティビティを同じログに添付できます。
logger = logging.getLogger("__main__")
(または、別の名前を使用して別のロガーを設定することもできます。)
例:
import time
import logging
# set up the logging
def setup_logger(logfilename = None):
logger = logging.getLogger(__name__) # probably __name__ == "__main__"
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
if logfilename:
# write to logfile
handler = logging.FileHandler(logfilename)
else:
# write to stdout
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
logger = setup_logger("test.log")
# example use of the logger
maxval = 100
for i in range(1,maxval+1):
# do something
time.sleep(0.05)
if (i)%(maxval/10) == 0:
logger.debug("progress:% 4d %% done", i)
出力:
2013-05-15 21:03:23,313 - DEBUG - progress: 10 % done
2013-05-15 21:03:23,822 - DEBUG - progress: 20 % done
2013-05-15 21:03:24,323 - DEBUG - progress: 30 % done
2013-05-15 21:03:24,825 - DEBUG - progress: 40 % done
2013-05-15 21:03:25,326 - DEBUG - progress: 50 % done
2013-05-15 21:03:25,827 - DEBUG - progress: 60 % done
2013-05-15 21:03:26,328 - DEBUG - progress: 70 % done
2013-05-15 21:03:26,829 - DEBUG - progress: 80 % done
2013-05-15 21:03:27,330 - DEBUG - progress: 90 % done
2013-05-15 21:03:27,831 - DEBUG - progress: 100 % done