タイトルが内容のすべてですが、一応捕捉
python -c 'import time; print(1); time.sleep(1); print(2)'
⇒1が表示され、しばらくしてから2が表示される(ラインバッファ)
sh -c 'echo 1; sleep 1; echo 2'
⇒1が表示され、しばらくしてから2が表示される(ラインバッファ)
python -c 'import time; print(1); time.sleep(1); print(2)' | tee /dev/null
⇒しばらくしてから、1と2が一気に表示される(Python側でバッファリング)
sh -c 'echo 1; sleep 1; echo 2' | tee /dev/null
⇒1が表示され、しばらくしてから2が表示される(ラインバッファ)
なぜPythonでパイプしたときだけ挙動が違う?
Pythonは賢いので、stdout, stderrが端末だったらラインバッファ、そうじゃなければ普通にバッファリングしてくれる。(いっぱい出力するときは、バッファリングした方が圧倒的に速い)
ちなみに、Pythonが自分自身でそれをやっているので、stdbuf
コマンドでは挙動を変えられない。
-u
オプションを付けるとunbufferedになる。
python -u -c 'import time; print(1); time.sleep(1); print(2)' | tee /dev/null
⇒1が表示され、しばらくしてから2が表示される(バッファリングなし)