[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: Re: [PyQt] 'import PyQt4.uic.Compiler' fails with Python 3.2
From: Phil Thompson <phil () riverbankcomputing ! com>
Date: 2010-09-25 11:49:54
Message-ID: e2ea60000fc123c325da63ebb458059f () localhost
[Download RAW message or body]
On Fri, 24 Sep 2010 20:01:07 +0200, Arfrever Frehtes Taifersar Arahesis
<arfrever.fta@gmail.com> wrote:
> 2010-09-23 18:22:20 Phil Thompson napisał(a):
>> On Wed, 22 Sep 2010 16:16:05 +0200, Arfrever Frehtes Taifersar Arahesis
>> <arfrever.fta@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@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@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
>
> I don't know why 'from PyQt4.uic.Compiler.qtproxies import
> LiteralProxyClass'
> initially fails, but it also fails with Python 2.6, 2.7 and 3.1.
>
> You can apply the following patch to see this behavior:
>
> --- pyuic/uic/Compiler/proxy_type.py
> +++ pyuic/uic/Compiler/proxy_type.py
> @@ -16,7 +16,12 @@
> return type.__getattribute__(cls, name)
> except AttributeError:
> # Avoid a circular import.
> - from PyQt4.uic.Compiler.qtproxies import LiteralProxyClass
> + try:
> + from PyQt4.uic.Compiler.qtproxies import
LiteralProxyClass
> + print("'from PyQt4.uic.Compiler.qtproxies import
> LiteralProxyClass' succeeded")
> + except ImportError:
> + print("'from PyQt4.uic.Compiler.qtproxies import
> LiteralProxyClass' failed")
> + raise
>
> return type(name, (LiteralProxyClass, ),
> {"module":
> moduleMember(type.__getattribute__(cls,
"module"),
>
> Try to import PyQt4.uic.Compiler after applying this patch.
>
>> - if Python is no longer suppressing certain exceptions then you would
>> expect to see new exceptions raised, not a segfault
>
> I see exceptions, not a segmentation fault.
>
>> - if adding a call to str(), which shouldn't have any side effects,
>> avoids
>> the segfault then that implies a memory corruption problem.
>
> str(x) calls x.__str__(), which can have side effects.
Got it. The import fails the first time and succeeds subsequently. It will
be fixed properly in tonight's snapshot.
Thanks for your perseverance.
Phil
_______________________________________________
PyQt mailing list PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic