You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用subprocess执行dir/ipconfig时utf-8解码报错问题咨询

问题原因
  • 该问题是Windows平台终端输出编码不匹配导致的:简体中文版本的Windows系统中,cmd默认输出编码为GBK(代码页936),而非你使用的UTF-8。
  • whoami、arp -a这类命令的输出全部为英文字符,GBK编码与UTF-8编码对英文字符的编码规则完全兼容,因此用UTF-8解码不会触发异常;但dir、ipconfig这类命令的输出包含中文提示信息,GBK编码的中文字节无法被UTF-8规则识别,就会抛出UnicodeDecodeError。
  • 报错中出现的0xff字节,可能是Windows控制台输出的特殊控制字符、或者代码页切换产生的标记字节,同样无法被UTF-8解码。
修复方案

方案1:指定对应编码解码

简体中文Windows环境下直接指定GBK编码解码即可:
将result = result.decode('utf-8')修改为result = result.decode('gbk')

方案2:添加容错参数适配不确定编码场景

如果需要兼容不同语言、不同配置的系统,避免个别异常字节导致解码失败,可以给decode方法添加errors参数:

# 忽略无法解码的异常字节
result = result.decode('utf-8', errors='ignore')
# 或将无法解码的字节替换为统一占位符�
result = result.decode('utf-8', errors='replace')

该方案兼容性最高,不会因编码问题触发程序异常。

方案3:直接在subprocess调用时指定编码

Python 3.7及以上版本支持在Popen参数中直接指定encoding和容错规则,不需要手动处理解码逻辑:

execute = subprocess.Popen(
    command, 
    shell=True, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE, 
    stdin=subprocess.PIPE,
    encoding='gbk',
    errors='replace'
)
# 后续直接读取的就是字符串类型,无需手动decode
result = execute.stdout.read() + execute.stderr.read()

内容的提问来源于stack exchange,提问作者adrq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:18:03