[PyQt] 'import PyQt4.uic.Compiler' fails with Python 3.2

Phil Thompson phil at riverbankcomputing.com
Thu Sep 23 17:22:20 BST 2010


On Wed, 22 Sep 2010 16:16:05 +0200, Arfrever Frehtes Taifersar Arahesis
<arfrever.fta at gmail.com> wrote:
> 2010-09-19 22:58:26 Phil Thompson napisał(a):
>> On Sun, 19 Sep 2010 22:55:17 +0200, Arfrever Frehtes Taifersar Arahesis
>> <arfrever.fta at gmail.com> wrote:
>> > 2010-09-19 15:24:53 Phil Thompson napisał(a):
>> >> On Fri, 17 Sep 2010 20:51:55 +0200, Arfrever Frehtes Taifersar
>> >> Arahesis
>> >> <arfrever.fta at gmail.com> wrote:
>> >> > I use SIP 4.11.1 and PyQt4 4.7.6.
>> >> > 
>> >> > $ python3.1 -c 'import PyQt4.uic.Compiler'
>> >> > $ python3.2 -c 'import PyQt4.uic.Compiler'
>> >> > Traceback (most recent call last):
>> >> >   File
>> >> >  
>> "/usr/lib64/python3.2/site-packages/PyQt4/uic/Compiler/proxy_type.py",
>> >> >   line 16, in __getattribute__
>> >> >     return type.__getattribute__(cls, name)
>> >> > AttributeError: type object 'ProxyBase' has no attribute 'module'
>> >> > 
>> >> > During handling of the above exception, another exception
occurred:
>> >> > 
>> >> > Traceback (most recent call last):
>> >> >   File "<string>", line 1, in <module>
>> >> >   File "/usr/lib64/python3.2/site-packages/PyQt4/uic/__init__.py",
>> line
>> >> 3,
>> >> >   in <module>
>> >> >     from PyQt4.uic.Compiler import indenter, compiler
>> >> >   File
>> >> >  
>> "/usr/lib64/python3.2/site-packages/PyQt4/uic/Compiler/compiler.py",
>> >> line
>> >> >   5, in <module>
>> >> >     from PyQt4.uic.Compiler import qtproxies
>> >> >   File
>> >> >  
>> "/usr/lib64/python3.2/site-packages/PyQt4/uic/Compiler/qtproxies.py",
>> >> >   line 8, in <module>
>> >> >     from PyQt4.uic.port_v3.proxy_base import ProxyBase
>> >> >   File
>> >> >  
>> "/usr/lib64/python3.2/site-packages/PyQt4/uic/port_v3/proxy_base.py",
>> >> >   line 4, in <module>
>> >> >     class ProxyBase(metaclass=ProxyType):
>> >> >   File
>> >> >  
>> "/usr/lib64/python3.2/site-packages/PyQt4/uic/Compiler/proxy_type.py",
>> >> >   line 11, in __init__
>> >> >     if not hasattr(args[0], "module"):
>> >> >   File
>> >> >  
>> "/usr/lib64/python3.2/site-packages/PyQt4/uic/Compiler/proxy_type.py",
>> >> >   line 19, in __getattribute__
>> >> >     from PyQt4.uic.Compiler.qtproxies import LiteralProxyClass
>> >> > ImportError: cannot import name LiteralProxyClass
>> >> 
>> >> This looks like a Python 3.2a2 bug.
>> > 
>> > If it's really a bug in Python, and not another intentional,
>> incompatible
>> > change,
>> > then could you report it to http://bugs.python.org/ ?
>> > (I use snapshots of Python, updated at least once per week, not
3.2a2.)
>> 
>> It disappears if you add a str(cls) just before the import statement
>> which
>> suggests it's a bug rather than a change. However I don't have enough
>> information to put together a proper bug report.
> 
> It's not a bug in Python 3.2 :) .
> 
> http://docs.python.org/dev/py3k/whatsnew/3.2.html:
> "The hasattr() function used to catch and suppress any Exception.
> Now, it only catches AttributeError. Under the hood, hasattr() works
> by calling getattr() and throwing away the results. This is necessary
> because dynamic attribute creation is possible using __getattribute__()
> or __getattr__(). If hasattr() were to just scan instance and class
> dictionaries it would miss the dynamic methods and make it difficult
> to implement proxy objects."
> 
> The attached patch changes ImportError into AttributeError, which fixes
> 'import PyQt4.uic.Compiler'.

This doesn't explain the problem...

- the import of the qtproxies module shouldn't fail so wrapping it in
try/except shouldn't make any difference

- if Python is no longer suppressing certain exceptions then you would
expect to see new exceptions raised, not a segfault

- if adding a call to str(), which shouldn't have any side effects, avoids
the segfault then that implies a memory corruption problem.

Phil


More information about the PyQt mailing list