python-3.x 在subprocess.run中从标准输出获取文本,但没有UnicodeDecodeError

niwlg2el  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(184)

我从一个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?

jmp7cifd

jmp7cifd1#

如果不能依靠子过程生成有效的文本,就不要使用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等价物。

相关问题