我很难将subprocess.run函数与一个包含重音字符(例如"é")的命令一起使用.

考虑这个简单的例子:

# -*- coding: utf-8 -*-
import subprocess

cmd = "echo é"

result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE)

print("Output of subprocess.run : {}".format(result.stdout.hex()))
print("é char encoded manually : {}".format("é".encode("utf-8").hex()))

它提供以下输出:

Output of subprocess.run : 820d0a
é char encoded manually : c3a9

我不明白subprocess.run的返回值,难道不应该也是c3a9吗?我知道0d0a是CR+LF,但为什么是82

正因为如此,当我try 运行这条线路时:

output = result.stdout.decode("utf-8")

我收到UnicodeDecodeError异常,并显示以下消息:'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte

我try 以如下方式显式指定编码格式:

result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding="utf-8")

但这在调用subprocess.run时会引发相同的异常('utf-8' codec can't decode byte 0x82 in position 0: invalid start byte).

我在装有Python3.8.5的Windows10上运行这个程序.

我希望有人能帮我这个忙,有什么提示吗?

推荐答案

作为解决办法,try cp437解码:

print("Output of subprocess.run : {}".format(result.stdout.decode('cp437')))

# or

result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, text=True, 
                        encoding="cp437")

print(f"Output of subprocess.run : {result.stdout}")

从其他堆栈低答案看,Windows终端代码问题似乎是旧的,现在可能应该得到修复,但它似乎仍然存在.

https://stackoverflow.com/a/37260867/11815313

无论如何,我对Windows10终端编码没有更深入的了解,但cp437在我的Win10系统上工作.

然而,这Python 3.9.13 documentation 3. Using Python on Windows 3.7. UTF-8 mode个声明可以 Select 临时或永久(请注意文档中提到的注意事项)更改编码.

Python相关问答推荐

如何接收非原始对象作为查询参数?

将大小为n*512的数组绘制到另一个大小为n*256的数组的PC组件

无法获得指数曲线_fit来处理日期

Django关于UniqueBindition的更新

预期LP_c_Short实例而不是_ctyles.PyCStructType

pandas DataFrame中类型转换混乱

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

时间序列分解

Pytest两个具有无限循环和await命令的Deliverc函数

将图像拖到另一个图像

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

使用setuptools pyproject.toml和自定义目录树构建PyPi包

如何更改分组条形图中条形图的 colored颜色 ?

形状弃用警告与组合多边形和多边形如何解决

Scrapy和Great Expectations(great_expectations)—不合作

转换为浮点,pandas字符串列,混合千和十进制分隔符

不允许访问非IPM文件夹

计算分布的标准差

Python Pandas获取层次路径直到顶层管理

如何使用Numpy. stracards重新编写滚动和?