在 subprocess.run 中从 stdout 获取文本,没有 UnicodeDecodeError

问题描述 投票:0回答:1

我从 Windows 命令行调用中读取输出,如下所示:

result = subprocess.run(["cmd", "/c", "dir","c:\mypath"], stdout=subprocess.PIPE, text=True,check=True)

结果可能包含意外字符,并且我收到 UnicodeDecodeError。它尝试用

text = result.stdout.encode('ascii','replace').decode('ascii')
对其进行消毒,但这并不总是有帮助。

如何稳健地读取文本以避免任何 UnicodeDecodeError?

python python-3.x subprocess
1个回答
0
投票

如果您不能依赖子流程来生成有效文本,请不要使用

text=True
;但是当您需要解码该值时,您有责任尝试找出编码。

result = subprocess.run(
    ["cmd", "/c", "dir", r"c:\mypath"],
    capture_output=True, check=True)
print(result.stdout.decode("cp1252"))  # or whatever encoding the system is using

如果你可以预测预期的编码,你也可以说

result = subprocess.run(
    ["cmd", "/c", "dir", r"c:\mypath"],
    capture_output=True, check=True, encoding="cp1252")

从表面上看,您使用的是Windows;可能检查您当前的系统编码(CMD 窗口中

chcp
的输出是什么?)并进行相应调整。

(另请注意,对于其中带有文字反斜杠的任何字符串值都使用原始字符串。)

当然,如果只是获取目录列表,可能更喜欢

os.scandir()
或其
pathlib
等效项。

© www.soinside.com 2019 - 2024. All rights reserved.