すぐにPython stdoutをファイルに書き込む

すぐにPython stdoutをファイルに書き込む

Pythonスクリプトからテキストファイル()にstdoutを書き込もうとすると、python script.py > logコマンドの起動時にテキストファイルが生成されますが、Pythonスクリプトが完了するまで実際の内容は記録されません。たとえば、

script.py:

import time
for i in range(10):
    print('bla')
    time.sleep(5)

呼び出しを使用すると、5秒ごとにstdoutに印刷されますが、呼び出しはpython script.pyスクリプトpython script.py > logが完了するまでログファイルのサイズが0のままです。スクリプトの進捗状況を追跡するためにログファイルに直接書き込むことはできますかtail

編集するこれがうまくいくことがわかりましたpython -u script.py。私はstdoutのバッファリングを認識しませんでした。

ベストアンサー1

これは通常、プロセスのSTDOUTが端末以外の場所にリダイレクトされると、出力が一部のオペレーティングシステム固有のサイズ(多くの場合4kまたは8k)のバッファにバッファリングされるために発生します。対照的に、ターミナルに出力すると、STDOUTはラインバッファリングまたはまったくバッファリングされないため、各文字またはすべての\n文字の後に出力が表示されます。

通常、次のように STDOUT バッファリングを変更できます。stdbuf便利:

stdbuf -oL python script.py > log

これで、tail -F logビルドされるとすぐに各出力行を表示できます。


あるいは、各印刷後に出力ストリームを明示的にフラッシュすると、同じ効果が得られます。のように見えるsys.stdout.flush()これはPythonとして実装する必要があります。 Python 3.3以降を使用している場合、この関数にはこれを実行するキーワードprintもあります。flushprint('hello', flush=True)

おすすめ記事