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
もあります。flush
print('hello', flush=True)