【问题标题】:Pyqt - QProcess / readAllStandardOutput() - Encoding?Pyqt - QProcess / readAllStandardOutput() - 编码?
【发布时间】:2017-01-20 10:16:53
【问题描述】:

我有以下代码来启动 .bat 文件并读取进程的输出:

def WriteFirmwareButtonEvent(self):

    self.process = QProcess(self)
    self.process.setProcessChannelMode(QProcess.MergedChannels)
    self.process.readyReadStandardOutput.connect(self.EventDataForReadFromCMD)
    self.process.start("run.bat")

def EventDataForReadFromCMD(self):
    ...

我试过了:

...
output = bytearray(self.process.readAllStandardOutput())
output = output.decode(xxx)
print (output)

但是任何编码都会给我关于解码第 4 个字符的错误 所以我尝试了纯转换为python字符串:

...
output = str(self.process.readAllStandardOutput())
print (output)

会给我:

b'Syst\x82m nem\x85\xa7e nal\x82zt uvedenou cestu.\r\n'

...
output = QByteArray(self.process.readAllStandardOutput())
test = QTextCodec.codecForLocale()
test = test.toUnicode(output)

编码时未知字符 4 也有同样的问题

但是如果我从 CMD 输出手动运行脚本应该是这样的:

系统 nemůže nalézt uvedenou cestu。

QProcess 的输出是否有一些特殊编码?以及他的阅读方法?

我现在唯一能做的就是为每个未知字符定义我自己的编码循环,我希望有更好的解决方案。

【问题讨论】:

  • 你看QString::fromLocal8Bit()QTextCodec::codecForLocale()了吗?
  • PyQt5 不再有 QString
  • 我相信QTextCodec 仍然可用。
  • 我遇到了同样的问题未知字符:/请检查更新后的问题

标签: python string qt python-3.x pyqt5


【解决方案1】:

好的,我找到了答案……

        ...
        output = bytearray(self.process.readAllStandardOutput())
        output = output.decode(self.GetCMD_Encoding())
        print (output)

    def GetCMD_Encoding(self):

        CMD = QProcess(self)
        CMD.setProcessChannelMode(QProcess.MergedChannels)
        CMD.start("C:\Windows\System32\chcp.com")
        CMD.waitForReadyRead()
        output = bytearray(CMD.readAllStandardOutput())
        output = output.decode("ascii")
        output = output[18:]
        return "cp" + output

输出:

系统 nemůže nalézt uvedenou cestu。

【讨论】:

  • 如果可能的话,您应该尝试按照 Benjamin T 在 cmets 中对您的问题的建议使用 QTextCodec.codecForLocale(),而不是对字符集进行硬编码。并非每个人的系统都设置为在控制台上使用代码页 852。
  • 我试过了,但我得到的结果与任何其他编码相同。第 4 个字符出错。您可以在我尝试过的问题中看到更新的代码。
  • 我明白了,那么在您的特定情况下可能没问题。看起来批处理文件中运行的任何内容也对其字符集进行了硬编码,而不是对语言环境敏感。
  • 理论上我可以通过chcp 从另一个Qprocess 获取这个字符集,然后使用正确的编码:) 例如,您可以在计算机上的CMD 中尝试chcp 吗?因为来自chcp 的标准输出我可以通过 ascii 轻松解码
  • 当然,我得到Active code page: 437 作为结果。我的 Windows 10 的语言环境设置为美国英语。如果我将其设置为德语,结果很可能是代码页 850。
【解决方案2】:

Python 有一个名为 mbcs 的编解码器,它根据当前的 ANSI 代码页对文本进行解码,这应该完全符合您的需要:

output = output.decode('mbcs')

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多