我在使用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
?
因此,当我尝试运行这一行代码时:
output = result.stdout.decode("utf-8")
我遇到了一个UnicodeDecodeError异常,错误信息如下:'utf-8'解码器无法解码0x82字节,位于位置0,起始字节无效
我尝试像这样明确指定编码格式:
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版本的Windows 10上运行此程序。
希望有人能够帮助解决这个问题,可以给一些提示吗?
sys.stdout.encoding
的输出是“UTF-8”,而不是“cp437”……但我只能使用cp437解码stdout。我会假设这是一些Windows魔法 :) - PaulM