[PyQt] Writing dual python2/python3 code and the use of PyQt5.uic

Eli Schwartz eschwartz at archlinux.org
Sun Mar 24 01:48:30 GMT 2019


I've been devoting some time recently to incrementally porting a PyQt5
application "calibre" (https://github.com/kovidgoyal/calibre/) from
python2 to polyglot code, hoping to get it running with python3 at some
point. One recent stumbling block I hit was that it uses the uic module
to compile forms into a cStringIO.StringIO.

What I wanted to do was switch it to using the modern io interface, but
as it turns out, PyQt5 uses unqualified "str" instances to write out the
form. As a result, I cannot use io.StringIO on python2, and I cannot use
io.BytesIO on python3.

The uic module quite specifically seems to expect that it will
manipulate unicode strings. I was able to get io.StringIO buffers to
work correctly with both python2 and python3 after I modified two files
to contain a "from __future__ import unicode_literals":

/usr/lib/python2.7/site-packages/PyQt5/uic/__init__.py
/usr/lib/python2.7/site-packages/PyQt5/uic/Compiler/indenter.py

Can this be added to at least these two files in the official
distribution? It seems to be a mistake that it ever assumed the str type.

-- 
Eli Schwartz
Arch Linux Bug Wrangler and Trusted User

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 1601 bytes
Desc: OpenPGP digital signature
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20190323/16c7aa17/attachment-0001.sig>


More information about the PyQt mailing list