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

Eli Schwartz eschwartz at archlinux.org
Sun Mar 24 13:59:13 GMT 2019

On 3/24/19 6:07 AM, Phil Thompson wrote:
> On 24 Mar 2019, at 1:48 am, Eli Schwartz <eschwartz at archlinux.org> wrote:
>> 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.
> This...
> https://python-future.org/unicode_literals.html
> ...makes me nervous. I would prefer a more specific fix.

The alternative is to add u'' decorations to the specific strings that
cannot be python2's dual purpose str/bytes.

I *think* this should be sufficient:


(Applied on top of a tarball import as I could not find any version
control sources for PyQt5.)

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/20190324/266c8424/attachment.sig>

More information about the PyQt mailing list