如何在subprocess.run中读取Windows命令行输出并避免UnicodeDecodeError?
解决Windows命令行输出UnicodeDecodeError的可靠方法
核心问题根源
你遇到的错误是因为Windows命令行的默认编码并非UTF-8,但subprocess.run的text=True参数默认用UTF-8解码输出,一旦输出包含非UTF-8字符就会抛出UnicodeDecodeError。之前的encode('ascii','replace')方法无效,是因为它在解码失败后才执行,根本没机会处理原始字节流。
可靠解决方案
指定命令行对应的编码解码
Windows中文系统的cmd默认编码是GBK(对应代码页936),你可以直接在subprocess.run中指定encoding参数替代text=True,让解码一步到位:result = subprocess.run(["cmd", "/c", "dir", r"c:\mypath"], stdout=subprocess.PIPE, encoding="gbk", check=True) # 直接获取解码后的文本 output_text = result.stdout如果不确定当前cmd的编码,先执行
chcp命令查看代码页:比如返回Active code page: 936对应GBK,1252对应Latin-1,替换成对应编码即可。字节读取后容错解码
要是无法确定编码,先读取原始字节流,再用错误处理策略解码,避免抛出异常:result = subprocess.run(["cmd", "/c", "dir", r"c:\mypath"], stdout=subprocess.PIPE, check=True) # 尝试用GBK解码,失败则替换无法识别的字符 try: output_text = result.stdout.decode("gbk") except UnicodeDecodeError: output_text = result.stdout.decode("gbk", errors="replace")也可以直接一步到位,用
errors="replace"把无法解码的字符替换成�:output_text = result.stdout.decode("gbk", errors="replace")简化命令(可选)
对于简单的命令,可以用shell=True简化写法,但注意如果路径包含特殊字符(如空格、引号)要谨慎使用:result = subprocess.run("dir c:\mypath", shell=True, stdout=subprocess.PIPE, encoding="gbk", check=True)
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

