Windows 8下Python subprocess.Popen stdout UTF-8解码失败求助
解决思路
- 核心问题:Windows系统默认控制台编码并非UTF-8(中文Windows通常是
cp936即GBK),硬用UTF-8解码自然会报错。
方案一:自动适配系统编码解码
替换原代码中解码的部分,用当前系统的标准输出编码解码,同时添加错误处理避免崩溃:
import sys # ... 其他代码 ... o = test_process.communicate()[0] o = (o or b'') # 用系统stdout编码解码,无法解码的字符替换为� sys.stdout.write(o.decode(sys.stdout.encoding, errors='replace'))
方案二:在Popen中指定正确编码(推荐)
利用Python 3.7+的text=True参数直接以文本模式读取输出,同时指定与系统匹配的编码:
import sys import os import subprocess # ... 其他代码 ... test_process = subprocess.Popen( ['python', os.path.join(self.bin_dir, self.bin_name)] + arg_list, cwd=os.path.normpath(cwd), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, encoding=sys.stdout.encoding ) o = test_process.communicate()[0] sys.stdout.write(o)
注:用os.path.join替代字符串拼接路径,更适配跨平台场景。
方案三:强制子进程输出UTF-8
如果子进程是Python脚本,可以通过参数或环境变量强制其输出UTF-8:
- 添加Python运行参数:
test_process = subprocess.Popen( ['python', '-X', 'utf8', os.path.join(self.bin_dir, self.bin_name)] + arg_list, # ... 其他参数 ... )
- 或者设置环境变量:
env = os.environ.copy() env['PYTHONUTF8'] = '1' test_process = subprocess.Popen( ['python', os.path.join(self.bin_dir, self.bin_name)] + arg_list, env=env, # ... 其他参数 ... )
这样子进程输出会统一为UTF-8,原有的UTF-8解码逻辑就能正常工作。
内容的提问来源于stack exchange,提问作者Boooooo
相关产品推荐
相关产品推荐

