Python 3.14では、argparseのヘルプや引数エラーに色が付く場合があります。ログへ保存するとANSIエスケープシーケンスが混じり、差分比較や検索の邪魔になります。後から正規表現で削るより、出力元で色を止めるのが基本です。
Python 3.14専用CLIなら
color=False、その実行だけ止めるならPYTHON_COLORS=0、対応する他ツールも含めるならNO_COLORを選びます。
この記事は2026年10月9日に確認したPython 3.14の公式資料をもとにしています。説明用コードは練習用ファイルや最小CLIで確認するための例です。
最小CLIでヘルプとエラーを分ける
先にPythonが3.14系か確認します。colorは3.14で追加されたため、3.13以前へ無条件に渡してはいけません。
python3 --versionpython --version次をdemo.pyとして保存します。説明用の最小CLIです。--helpは標準出力、無効な引数のエラーは標準エラー出力へ出るため、保存先を分けます。
import argparse
parser = argparse.ArgumentParser(prog="demo")
parser.add_argument(
"--mode",
choices=("fast", "safe"),
required=True,
)
parser.parse_args()python3 demo.py --help > help.txt
python3 demo.py --mode unknown 2> error.txtpython .\demo.py --help 1> help.txt
python .\demo.py --mode unknown 2> error.txtコード側で確実に消すならcolor=False
Python 3.14のargparse公式ドキュメントでは、color=Falseで色付き出力を常に無効化できると説明されています。FORCE_COLORが設定されていても無効のままです。既定のcolor=Trueでは、実際の着色が環境変数と端末能力に左右されます。
parser = argparse.ArgumentParser(
prog="demo",
color=False,
)常にプレーンテキストを出したい場合に向きます。3.13以前にも対応する共通コードへ、そのまま追加しないでください。
コードを変えないなら環境変数を使う
公式資料は、標準エラー出力をファイルへ保存した場合も色コードが入り得るため、NO_COLORまたはPYTHON_COLORSを使うよう案内しています。Python公式の色制御による優先順位は、PYTHON_COLORS、NO_COLOR、FORCE_COLORの順です。
したがってPYTHON_COLORS=1はNO_COLORを上書きし、NO_COLORはFORCE_COLORを上書きします。NO_COLORとFORCE_COLORは空でない値が設定されているかで判断され、NO_COLOR=0でも設定ありとして扱われます。
| 設定 | 用途 | 範囲 |
|---|---|---|
PYTHON_COLORS=0 | 色を無効化 | Pythonだけ |
NO_COLOR=1 | 色を無効化 | 対応する他ツールも対象 |
FORCE_COLOR=1 | 色を強制 | 無効化には使わない |
POSIX系では行頭の代入がそのコマンドだけに適用され、元の値を変更しません。
PYTHON_COLORS=0 python3 demo.py --mode unknown 2> error.txt複数ツールを対象にする場合は、継承中のPYTHON_COLORS=1がないことを確認して使います。
NO_COLOR=1 python3 demo.py --mode unknown 2> error.txtPowerShellでは元の値を復帰する
PowerShellで代入すると現在のセッションに残ります。元の値を保存し、未設定だった場合だけ削除します。
$old = $env:PYTHON_COLORS
try {
$env:PYTHON_COLORS = '0'
python .\demo.py --mode unknown 2> error.txt
}
finally {
if ($null -eq $old) {
Remove-Item Env:PYTHON_COLORS -ErrorAction SilentlyContinue
}
else {
$env:PYTHON_COLORS = $old
}
}確認する変数は3つだけ
環境変数を無差別に一覧表示せず、PYTHON_COLORS、NO_COLOR、FORCE_COLORだけを点検します。
printf '%s\n' \
"PYTHON_COLORS=${PYTHON_COLORS-<unset>}" \
"NO_COLOR=${NO_COLOR-<unset>}" \
"FORCE_COLOR=${FORCE_COLOR-<unset>}"'PYTHON_COLORS', 'NO_COLOR', 'FORCE_COLOR' | ForEach-Object {
"$_=$([Environment]::GetEnvironmentVariable($_, 'Process'))"
}ログにANSIコードが残っていないか確認する
次の説明用スクリプトは、代表的なANSI CSI開始列ESC [の有無だけを調べます。UTF-16で保存されたログも開始列のバイト並びを確認します。削除処理や全種類の制御文字の検査ではありません。
from pathlib import Path
data = Path("error.txt").read_bytes()
starts = (b"\x1b[", b"\x1b\x00[\x00", b"\x00\x1b\x00[")
has_ansi = any(start in data for start in starts)
print("ANSI found" if has_ansi else "No ANSI CSI found")残っている場合は、競合する3変数と実行したPythonの版を見直します。変更できない外部ツールの既存ログだけを扱う場合に限り、正規表現による除去を最後の手段として検討します。
結論
- Python 3.14専用CLIを常に無色にするなら
color=False。 - Pythonだけ一時的に止めるなら
PYTHON_COLORS=0。 - 対応ツール全体なら
NO_COLOR。ただしPYTHON_COLORS=1が最優先です。 - ヘルプの標準出力とエラーの標準エラー出力は別々に点検します。
コマンドラインでのデバッグも確認したい場合は、Python 3.14のpdbでPIDへ接続する際の確認手順も参考にできます。


コメント