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

Phil Thompson phil at riverbankcomputing.com
Sun Mar 24 14:18:14 GMT 2019


On 24 Mar 2019, at 1:59 pm, Eli Schwartz <eschwartz at archlinux.org> wrote:
> 
> 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:
> https://github.com/eli-schwartz/pyqt5/commit/1a014130024530eb0241cec7ef7ffb82e2c69fc6
> 
> patch:
> https://github.com/eli-schwartz/pyqt5/commit/1a014130024530eb0241cec7ef7ffb82e2c69fc6.patch
> 
> (Applied on top of a tarball import as I could not find any version
> control sources for PyQt5.)

What about Python v3.3 and earlier?

Phil


More information about the PyQt mailing list