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
相关产品推荐
相关产品推荐

