Python 3.14のargparseで色コードを消す方法|color=False・NO_COLOR・ログ保存

Python 3.14のargparseで、ヘルプの標準出力とエラーの標準エラー出力を分け、color=Falseまたは環境変数で色を消す流れを示す説明図

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 --version
python --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.txt
python .\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以前にも対応する共通コードへ、そのまま追加しないでください。

Python 3.14を確認し、stdoutとstderrを分け、色の無効化方法を選び、一時設定後にログのANSIコードを確認する5段階の説明図
argparseの色コードをコード側または実行環境側で止め、ログを点検する流れを示す説明図。 · 図を拡大

コードを変えないなら環境変数を使う

公式資料は、標準エラー出力をファイルへ保存した場合も色コードが入り得るため、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.txt

PowerShellでは元の値を復帰する

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へ接続する際の確認手順も参考にできます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次