T07
PYTHONIOENCODING is set, but python -I ignores it
Symptom
You set PYTHONIOENCODING=utf-8 to fix T06, but the places that call python -I still crash the same way.
Check it in 30 seconds
Paste into Windows PowerShell 5.1. It only creates files under your %TEMP% folder. If the last line says REPRODUCED, it happens on your machine.
$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")')
$old = $env:PYTHONIOENCODING; $env:PYTHONIOENCODING = 'utf-8'
python -I "$d\dash.py" > "$d\o1.txt" 2> "$d\e1.txt"; $a = $LASTEXITCODE
python "$d\dash.py" > "$d\o2.txt" 2> "$d\e2.txt"; $b = $LASTEXITCODE
$env:PYTHONIOENCODING = $old
$err = [IO.File]::ReadAllText("$d\e1.txt")
"with -I exit=$a, without -I exit=$b"
if ($a -ne 0 -and $err -match 'UnicodeEncodeError' -and $b -eq 0) { 'REPRODUCED' } else { 'NOT REPRODUCED' }
}
Why it happens
-I (isolated mode) ignores every PYTHON* environment variable. The flag you added for safety also drops the encoding setting. On Python 3.15 or later UTF-8 is the default, so this is not expected there (not tested).
Fix
Drop -I, or call sys.stdout.reconfigure(encoding='utf-8') inside the script.
import sys
sys.stdout.reconfigure(encoding='utf-8')
On the author's machine
exit 1 with -I, 0 without
Author's machine: Windows 11 / Windows PowerShell 5.1.26100 / Python 3.13.7 / Claude Code 2.1.304, Japanese Windows (code page 932). Checked 2026-10-20 to 22.
If you searched for
Related
cc-win-kit bundles the parts that avoid these traps from the start: a write guard (with onFailure: block), an unattended runner, a doctor that scans your files and hook settings, CLAUDE.md templates and the full test suite.
Other symptoms
- PowerShell returns exit code 1 when the script exited with 2
- The second value passed with -File disappears without an error
- With -File, a,b stays one string instead of an array
- Non-ASCII text piped to claude -p, python or git arrives as ?
- Output from python or claude turns into mojibake in a variable
- Python works when run by hand but crashes under Task Scheduler or redirection
- A .ps1 with non-ASCII text fails to parse or prints mojibake
- A .cmd / .bat file runs its comment text as commands
- $variables in a powershell -Command one-liner vanish before it runs
- Get-ChildItem -Include is ignored and every file comes back
- Markdown backticks inside "..." turn into newlines and tabs
- A log that is being written shows 0 bytes
- claude -p --allowedTools swallows the prompt after it
- A Claude Code PreToolUse hook lets the write through when it times out
- A PowerShell hook called with -Command does not block Claude Code
- No Claude Code hook runs at all (disableAllHooks is still set)