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

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:

  1. 添加Python运行参数:
test_process = subprocess.Popen(
    ['python', '-X', 'utf8', os.path.join(self.bin_dir, self.bin_name)] + arg_list,
    # ... 其他参数 ...
)
  1. 或者设置环境变量:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:50:25