プログラムの出力を画面とファイルに同時にリダイレクトする

プログラムの出力を画面とファイルに同時にリダイレクトする

Pythonスクリプトがあります。ターミナルに何かを出力している間にその結果を保存したいのですが、試してみました

python program.py 2>&1 | tee output.txt

しかし、プログラムが終了した後にのみ、すべての内容が画面に印刷されるようです。実行中は出力がありません。プログラムの実行中に進行状況を知りたいので、本当に困っています。画面とファイルに同時に出力する方法はありますか?


2019年11月13日更新

@egmont さん、助けてくれてありがとう。同じ問題に遭遇している人は、次のコマンドを試してみてください。画面に出力され、同時にファイルに書き込まれます。

stdbuf -oL python program.py 2>&1 | tee ouput.txt

答え1

私も同じ問題に遭遇していました( 、バックグラウンド化( )、リダイレクトstdoutなど、操作を伴う「あらゆる」もの)。興味深いことに、 では問題は解決しませんでした。しかし、Python 2と3(どちらのサブバージョンかはわかりません、すみません)はどちらも、 とをバッファリングしないオプションをサポートしていることがわかりました。nohup&stdbuf -oL-ustdoutstderrpython2.7.1 の man ページ

私は(そのマニュアルページによると)Python 2.7でもstdinバッファリングされていないことに気付きました。一方、Python 3(私の場合は3.10)のマニュアルページには、特に次のように書かれています。"This option has no effect on the stdin stream."

したがって、OP の元のコマンドは次のようになります。

python -u program.py 2>&1 | tee output.txt

すると、PHP / awk などで期待される動作が得られます。

OP が「画面とファイルに同時に出力する方法はありますか?」と尋ねたように、この「解決策」はteeOP がすでに推測したものに依存しており、python -uより馴染みのある動作を提供する必要があります。

関連情報