一覧へEnglish

T06

手で動かすと通る Python が、タスクスケジューラやリダイレクトのときだけ落ちる

症状

画面で動かすと通るスクリプトが、> ファイル へのリダイレクトやタスクスケジューラ経由のときだけ UnicodeEncodeError で落ちる。— や ✓ のような記号を print しただけで起きる。

30秒で確かめる

PowerShell(Windows PowerShell 5.1)に貼って実行します。一時フォルダ(%TEMP% の下)にだけファイルを作ります。最後に REPRODUCED と出たら、あなたの PC で起きています。

$d = Join-Path $env:TEMP ('cc-trap-' + (Get-Date -Format 'yyyyMMddHHmmss')); New-Item -ItemType Directory $d -Force | Out-Null
$pyv = & python -c "import sys; print('%d.%d.%d' % sys.version_info[:3])" 2>$null
if (-not $pyv) { 'CANNOT CHECK (python not found, or only the Microsoft Store stub: install Python from python.org)' } else {
"python $pyv"
[IO.File]::WriteAllText("$d\dash.py", 'print("a" + chr(0x2014) + chr(0x2713) + "b")')
python "$d\dash.py" > "$d\out.txt" 2> "$d\err.txt"; $e = $LASTEXITCODE
$err = [IO.File]::ReadAllText("$d\err.txt")
"exit=$e, UnicodeEncodeError=$($err -match 'UnicodeEncodeError')"
if ($e -ne 0 -and $err -match 'UnicodeEncodeError') { 'REPRODUCED' } else { 'NOT REPRODUCED' }
}

なぜ起きるか

Windows の Python は、出力先が画面なら Unicode をそのまま書けるが、ファイルやパイプだと既定のコードページ(日本語なら cp932)で符号化する。その表に無い文字で落ちる。なお Python 3.15(2026年10月9日公開)は UTF-8 を既定にしたので(PEP 686)、3.15 以降では起きない見込み(作者の PC は 3.13.7 で、3.15 では試していない。確かめるコードは最初に Python の版を出す)。

直し方

送る側で PYTHONIOENCODING=utf-8 を設定する。アプリで直すなら、画面でないときだけ sys.stdout.reconfigure(encoding='utf-8')。

$env:PYTHONIOENCODING = 'utf-8'

作者の PC での結果

UnicodeEncodeError、終了コード 1

作者の PC: Windows 11 / Windows PowerShell 5.1.26100 / Python 3.13.7 / Claude Code 2.1.304、日本語の Windows(コードページ 932)。2026-10-20〜22 に確認。

こんな言葉で探した人へ

関連

この穴を最初から踏まないようにした部品(書き込み先を絞る安全装置〈onFailure: block 付き〉、夜の無人実行、ファイルとフックの設定を調べる健康診断、CLAUDE.md の型、試験一式)は cc-win-kit にまとめています。

cc-win-kit 英語版(Payhip、19ドル。日本語版は 2026年10月31日に note で公開)

ほかの症状