[PyQt] UnicodeDecodeError with output from Windows OS command

J Barchan jnbarchan at gmail.com
Thu Nov 30 11:02:57 GMT 2017


D
​ear, helpful PyQt/Python experts,


I have a problem, receiving a ​UnicodeDecodeError.  The full details are at
https://forum.qt.io/topic/85493/unicodedecodeerror-with-output-from-windows-os-command,
in combination with
https://forum.qt.io/topic/85064/python3-pyqt5-x-qbytearray-to-string.  Here
I will try to be brief to cover only the salient points.:

   1. I am spawning a QProcess under Windows to run an arbitrary OS
   command, and grab its output to display in a window.
   2. I use QByteArray Process.readAllStandardOutput() to receive the
   child's output in the parent.
   3. I wish to display it in a dialog window, so I (believe I need to) use
   QLineEdit.setPlainText(QString) to do that.
   4. To achieve that I will need to convert a QByteArray to a QString.
   5. Since neither of these types and their methods are available in PyQt,
   I asked how to do that in
   https://forum.qt.io/topic/85064/python3-pyqt5-x-qbytearray-to-string.
   6. The answer I got from a PyQt expert, "jazzycamel", who visited there
   (and told me to come to this forum in future, which is why I am here now!),
   was that the Python/PyQt way to do this is to work with its native bytes
   & str types respectively, and use str = bytes.decode('utf-8') to
   "convert".

While this has worked fine under Linux, when a user runs my Qt app under
Windows and issues a perfectly normal robocopy command under a standard UK
Windows with really nothing special/unusual going on with filenames, he
gets:

> Unhandled Exception:
>
> 'utf-8' codec can't decode byte 0x9c in position 32: invalid start byte
>
> <class 'UnicodeDecodeError'>
> File "C:\HJinn\widgets\messageboxes.py", line 289, in
> processReadyReadStandardOutput
> output = output.data().decode('utf-8')
>
I understand this to be a Python/PyQt problem.  I *believe* if I used the
native Qt/C++ calls for this --- which apparently I can't from PyQt ---
there would be no issue.

I have over the years written, say, Windows C programs using standard
Windows SDK calls for this kind of "redirector".  I simply grab the output
of a sub-process and throw it at whatever the native Windows SetTextEdit()
function is, and all has always been fine.

Note that I have *never* had to guess/decode/convert bytes to some text
encoding, and this has worked across all platforms forever.  So I really
don't expect to have to do so now, unless there's something going on in
Qt/PyQt which is fundamentally any different.

So... can you please tell me how under Python/PyQt I can just display the
output from an OS command (assuming "text-type" output, I don't expect
arbitrary binary bytes) without the slightest chance of any kind of "I
can't convert" Exception, please?

Thank you in advance!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20171130/4af29744/attachment.html>


More information about the PyQt mailing list