2017-01-20 2 views
0

У меня есть следующий код для запуска bat-файл и читать выход процесса:Pyqt - QProcess/readAllStandardOutput() - Кодирование?

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-го символа Таким образом, у меня есть попробовал чисто новообращенный питона строки:

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

даст мне:

b'Syst \ x82m нэм \ x85 \ xa7e NAL \ x82zt uvedenou cestu. \ Г \ п»

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

Это же проблема неизвестного характера 4 при кодировании

Но если Я запускаю сценарий вручную из вывода CMD, должен выглядеть следующим образом:

Systém nemůže nalézt uvedenou cestu.

есть ли специальная кодировка вывода из QProcess? и его методы чтения?

Единственное, что я могу сделать прямо сейчас, это определить мой собственный цикл кодирования для каждого неизвестного персонажа, и я надеюсь, что есть лучшее решение.

+0

Вы посмотрели на 'QString :: fromLocal8Bit()' и 'QTextCodec :: codecForLocale()'? –

+0

У PyQt5 больше нет QString –

+0

Я считаю, что 'QTextCodec' по-прежнему доступен. –

ответ

0

Ok я нашел ответ ...

 ... 
     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ém nemůže nalézt uvedenou cestu.

+0

Вам следует попробовать использовать 'QTextCodec.codecForLocale()', как было предложено Benjamin T, в комментариях к вашему вопросу вместо жесткого кодирования кодировки, если это возможно , Не всякая система настроена на использование Codepage 852 на консоли. – blubberdiblub

+0

Я попробовал, но у меня такие же результаты, как и с любой другой кодировкой. Ошибка при символе 4-го. Вы можете увидеть обновленный код в вопросе, где я его попробовал. –

+0

Понятно, что это, вероятно, нормально в вашем конкретном случае. Похоже, что все, что запускается в пакетном файле, также жестко закодировано в его кодировке, вместо того, чтобы быть чувствительным к локали. – blubberdiblub