为什么 Python 的子进程输出与 PTC 命令的 cmd 输出不同?

Why is Python's subprocess output different than cmd's of a PTC command?

提问人:Daniel 提问时间:10/11/2023 更新时间:10/12/2023 访问量:47

问:

我使用 Python 3.7Integrity Client 12.5 的命令。当我在 cmd 中使用它进行查询和项目时,我得到了每个细节的完美解码,没有未知的字节或十六进制值。但是,当我尝试使用im viewissue <itemID>

subprocess.run(<command_args>, capture_output=True).stdout.decode(encoding='utf-8')

我收到此异常:

"UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 528: invalid start byte"

我尝试过的所有其他编码类型都存在问题。但是当我在 cmd 中使用完全相同的命令时,我没有看到任何有问题的字符,所有内容都正确显示,如果我检查正确,它也使用 UTF-8。

有一些编码可以显示该字符(例如 Windows-1252),但解码后的字符与应有的字符不同。Byte 0xb5 翻译为“μ”,但最初它应该是“Á”,因为它在 cmd 输出中。

我尝试使用不同的编码、不同的函数,但无法找到导致两个平台输出之间出现这种差异的原因,或者除了手动将字符映射到正确的字符之外,我该如何克服这个问题。

python cmd python-3.7 mks-integrity ptc-windchill

评论

0赞 Hermann12 10/11/2023
这是否回答了您的问题,请使用 unicode 表示 cmd
0赞 tripleee 10/11/2023
你不可能尝试过很多编码;绝大多数传统的 8 位编码都会很乐意接受您可以扔给它们的几乎任何字节。当然,如果你选错了,你会得到mojibake,但是如果不能访问你正在运行的工具和有关系统编码的信息,我们无法猜测哪一个是正确的。
2赞 tripleee 10/11/2023
tripleee.github.io/8bit/#b5 列出了 Python 已知的所有 8 位编码,以及它在每个编码中映射到的字符。正确的编码是 cp850、cp852、cp857、cp858 之一。(披露:我是该页面的作者。
0赞 Daniel 10/12/2023
谢谢你的帮助,cp852 工作了。

答:

0赞 Daniel 10/12/2023 #1

感谢所有在评论中提供帮助的人。

解决方案是找到 cmd 与 或 一起使用的代码页,然后将其用作 Python 脚本中的指定编码,例如chcpmode

stdout.decode(encoding='cp852')

它是.cp852