具体表现

脚本里调用系统命令抓输出,英文正常,中文全是问号或方块,存进文件也没法看。

先判断哪一层出错

子进程输出用的是系统本地代码页,父进程按 UTF-8 解码,两边编码不一致。判断时先分清是 subprocess 中文乱码 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

操作步骤

  1. 显式指定 encoding 与 errors
  2. Windows 下确认代码页并用 text 模式
  3. 必要时直接读字节再自行解码

对应的命令或配置片段如下,可直接复制:

import subprocess
r = subprocess.run(['ping', '127.0.0.1', '-n', '1'],
                   capture_output=True, text=True,
                   encoding='gbk', errors='replace', timeout=20)
print(r.stdout)

如果同一现象隔一段时间又出现,多半是某个定时任务或重启流程把配置覆盖回去了,顺手查一遍启动脚本。测试环境复现不了时,先对比两边的版本号和配置文件,差异往往就在被忽略的那几行里。

收尾检查

输出中的中文能正常显示,写入日志文件后也不乱码。

作者 9823189