6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[備忘録][一行メモ]Pythonに-uオプション付けたらstdout, stderrがunbufferedになる。teeにパイプするとき便利

Last updated at Posted at 2020-05-15

タイトルが内容のすべてですが、一応捕捉

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が表示される(バッファリングなし)

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?