Pyqt - QProcess / readAllStandardOutput() - 编码?

时间:2017-01-20 10:16:54

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

我有以下代码来启动.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输出手动运行脚本应如下所示:

  

Systémnemůženaléztuvedenoucestu。

是否有一些来自QProcess的特殊输出编码?和他的阅读方法?

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

2 个答案:

答案 0 :(得分:0)

好的,我找到了答案......

        ...
        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

输出:

  

Systémnemůženaléztuvedenoucestu。

答案 1 :(得分:0)

Python有一个名为mbcs的编解码器,该编解码器将根据当前的ANSI代码页解码文本,该代码页应完全满足您的要求:

output = output.decode('mbcs')