console.py 1.3 KB

1234567891011121314151617181920212223242526272829
  1. # -*- coding: utf-8 -*-
  2. """控制台输出兜底 —— 中文 Windows 默认控制台代码页是 936 (GBK), 而脚本正文里常用 ✔ ✘ → 等符号。
  3. 踩过的坑: `scripts/page_fingerprint.py` 比对结果"全部一致", 却因为最后一行 print 里的 ✔
  4. 编不出来抛 `UnicodeEncodeError: 'gbk' codec can't encode character '\\u2714'`, 进程以退出码 1 结束 ——
  5. **闸门报告失败, 而实际是通过的**。2026-09-11 因此误判过一次 (同一坑在 portal_build.py 也踩了一次)。
  6. 所以: 凡是"以退出码讲话"的脚本 (回归闸门/校验/巡检), 入口先调 `soft()`, 把 stdout/stderr 的
  7. 错误处理降级为 replace (编不出的符号写成 `?`), 而不是让整条校验因为一个装饰性符号崩掉。
  8. 只降 errors, 不改 encoding: 控制台是 GBK 时中文照旧可读; 控制台是 UTF-8 时一切正常。
  9. """
  10. from __future__ import annotations
  11. import sys
  12. def soft(streams=None) -> None:
  13. """把 stdout/stderr 的编码错误策略降级为 'replace' (幂等, 失败静默)。"""
  14. for s in (streams or (sys.stdout, sys.stderr)):
  15. try:
  16. s.reconfigure(errors='replace')
  17. except Exception:
  18. pass
  19. def setup() -> None:
  20. """别名, 语义同 soft (给"入口初始化"读起来更顺)。"""
  21. soft()