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

