PYTHONUNBUFFERED=1 ってなに?

概要

`PYTHONUNBUFFERED=1`は、Pythonの標準出力(`stdout`)と標準エラー出力(`stderr`)の**バッファリングを無効にする**ための環境変数である。

通常、`print()`関数などで出力されたデータは、パフォーマンス向上のため、すぐにはコンソール等に書き込まれない。代わりに、ある程度の量が溜まるまで一時的にメモリ(バッファ)に保持され、まとめて書き出される。`PYTHONUNBUFFERED=1`を設定すると、この一時的な保持(バッファリング)がなくなり、出力が即座に行われるようになる。

主な用途

  • ログのリアルタイム監視: DockerコンテナやCI/CDパイプラインでスクリプトを実行する際、ログをリアルタイムで確認したい場合に必須である。
  • デバッグ: プログラムが予期せずクラッシュした際、どこまで処理が進んだかを正確に知るのに役立つ。
  • プロセス間連携: あるプログラムの出力を、パイプ(`|`)を使って別のプログラムの入力として渡す際に、出力を即座に次のプロセスへ送りたい場合にスムーズな連携が可能になる。

設定方法

Linux / macOS

PYTHONUNBUFFERED=1 python your_script.py

Docker (Dockerfile)

ENV PYTHONUNBUFFERED=1
CMD ["python", "your_script.py"]

Windows (コマンドプロンプト)

set PYTHONUNBUFFERED=1
python your_script.py

Windows (PowerShell)

$env:PYTHONUNBUFFERED=1
python your_script.py

代替手段

`python` コマンドの `-u` オプション

環境変数を設定する代わりに、 `-u` オプションを使っても同じ効果が得られる。

python -u your_script.py

`print` 関数の `flush` 引数 (Python 3.3+)

特定の `print` 文だけ即座に出力させたい場合に便利である。

print("This message will be flushed immediately.", flush=True)

注意点:パフォーマンスへの影響

バッファリングは、ディスクやコンソールへの書き込み処理の回数を減らすことでパフォーマンスを向上させる仕組みである。そのため、`PYTHONUNBUFFERED=1`を設定すると、特に出力処理が頻繁に発生するプログラムでは、理論上パフォーマンスがわずかに低下する可能性がある。ただし、一般的なログ出力などの用途では、この影響が問題になることはほとんどない。