pythonで print の出力結果を即時表示, 強制表示, フラッシュさせる(主にjupyter)

  • 17
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

背景

重い処理の進捗確認のため、処理の途中に挟んだprint文がその時点で出力されずに、
処理が終わってからまとめて出てくることがある。

処理速度やらの観点で言えばこの挙動は正しいかもしれないが、
即時出してもらいたいときに、これでは困る。。

jupyterだけ?

下記の例文では、jupyter(IPython notebook)だと起きるので、バッファ等の設定によるかも。
コンソールだとflushが指定なくとも、逐次出力されていた。

解決方法

  1. python3.3以降 :強制的にprintの出力を吐き出す:flushオプションを使う!
  2. python3.3より前と2.X:print後に sys.stdout.flush() を使う。(動作未確認)

print関数のオプションにflush=True をつける!(python3.3以降)

python3.3以降
print("", flush=True)

print後に sys.stdout.flush() を使う(動作未確認)

python3.3より前(下記コードはpython2系)
import sys
print ""
sys.stdout.flush()

例: python3.4とjupyterにて

jupyterで確認(コンソールではflush無しでも逐次出力された・・・)
import time
time.sleep(1)
print("processing A...")# ここでは表示されない・・・
time.sleep(1)
print("finish!")# 上のprintとまとめて出力される。。。

# flush を使うと・・・
time.sleep(1)
print("processing B(flush=True)", flush=True)# すぐに表示される!
time.sleep(1)
print("finish!", flush=True)