我从 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?
如果您不能依赖子流程来生成有效文本,请不要使用
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
等效项。