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

Windows下使用subprocess.run()打印非拉丁字符报错求助

Windows下subprocess执行含非拉丁字符Python代码的UnicodeEncodeError解决方法

错误原因

错误出在子进程内部的输出编码,而非父进程的捕获设置。在Windows默认环境下,Python子进程的stdout会继承控制台的默认编码(这里是CP1252),而俄文Делавер无法用CP1252编码,导致子进程执行print时直接抛出UnicodeEncodeError,父进程捕获到的是子进程的报错信息。

即使父进程设置encoding="utf8",也无法解决子进程自身的输出编码冲突问题。

解决方案

方案1:强制子进程stdout使用UTF-8输出

修改子进程代码,显式配置stdout的编码为UTF-8,确保输出内容能正确编码:

import subprocess
result = subprocess.run(
    ["python", "-c", "import sys; sys.stdout.reconfigure(encoding='utf-8'); print('Делавер')"],
    text=True,
    encoding="utf-8",
    capture_output=True,
)
print(result.stdout)
print(result.stderr)

方案2:设置PYTHONUTF8环境变量

通过环境变量让Python子进程默认使用UTF-8处理标准输入输出,无需修改子进程代码:

import subprocess
import os

# 复制当前环境并添加PYTHONUTF8=1
env = os.environ.copy()
env["PYTHONUTF8"] = "1"

result = subprocess.run(
    ["python", "-c", "print('Делавер')"],
    text=True,
    encoding="utf-8",
    capture_output=True,
    env=env
)
print(result.stdout)
print(result.stderr)

方案3:字节流捕获(备选)

如果不想修改子进程编码逻辑,也可以让子进程输出字节流,父进程再手动解码:

import subprocess
result = subprocess.run(
    ["python", "-c", "print('Делавер')"],
    capture_output=True,
)
# 手动解码输出内容
print(result.stdout.decode("utf-8"))
print(result.stderr.decode("utf-8"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:05:08