[PyQt] QtDBus: Unable to convert Array of Object Paths
Phil Thompson
phil at riverbankcomputing.com
Thu Dec 1 22:35:12 GMT 2011
On Thu, 01 Dec 2011 20:20:34 +0000, Chris Mayo
<cjmayo at users.sourceforge.net> wrote:
> On 30/11/11 16:37, Phil Thompson wrote:
>> On Sun, 27 Nov 2011 12:58:27 +0000, Chris Mayo
>> <cjmayo at users.sourceforge.net> wrote:
>>> On 27/11/11 12:51, Phil Thompson wrote:
>>>> On Sun, 27 Nov 2011 12:47:09 +0000, Chris Mayo
>>>> <cjmayo at users.sourceforge.net> wrote:
>>>>> With PyQt-x11-gpl-snapshot-4.9-e8284ed41e49,
>>>>> sip-4.13.1-snapshot-3b44dc2f0efd and:
>>>>>
>>>>> bus = QtDBus.QDBusConnection.systemBus()
>>>>> iface = QtDBus.QDBusInterface('org.freedesktop.UDisks',
>>>>> '/org/freedesktop/UDisks', 'org.freedesktop.UDisks', bus)
>>>>>
>>>>> print(iface.call('EnumerateDeviceFiles').arguments())
>>>>> print(iface.call('EnumerateDevices').arguments())
>>>>>
>>>>>
>>>>> the end of the output is:
>>>>>
>>>>> 0000:00:1f.2-scsi-5:0:0:0-part2', '/dev/fd0']]
>>>>> Traceback (most recent call last):
>>>>> File "./objectpath.py", line 10, in<module>
>>>>> print(iface.call('EnumerateDevices').arguments())
>>>>> TypeError: unable to convert a C++ 'QDBusArgument' instance to a
>> Python
>>>>> object
>>>>>
>>>>>
>>>>> EnumerateDeviceFiles returns an Array of Strings, but
EnumerateDevices
>>>>> returns an Array of Object Paths
>>>>>
>>>>
>>
http://hal.freedesktop.org/docs/udisks/UDisks.html#UDisks.EnumerateDevices
>>>>>
>>>>> Python 3.2.2, Qt 4.7.4, udisks 1.0.4, dbus 1.4.16 on amd64 Linux
>>>>
>>>> Can you send me a complete test case?
>>>>
>>>> Thanks,
>>>> Phil
>>>
>>> That was it! Nearly anyway, in full:
>>>
>>> #!/usr/bin/python
>>>
>>> from PyQt4 import QtDBus
>>>
>>> bus = QtDBus.QDBusConnection.systemBus()
>>> iface = QtDBus.QDBusInterface('org.freedesktop.UDisks',
>>> '/org/freedesktop/UDisks', 'org.freedesktop.UDisks', bus)
>>>
>>> print(iface.call('EnumerateDeviceFiles').arguments())
>>> print(iface.call('EnumerateDevices').arguments())
>>
>> Tonight's snapshot will fix this. However there needs to be some
>> discussion about the best way to (de)marshall arguments.
>
> Can't get ee8b9c7eb565 to compile:
>
> Generating the C++ source for the QtDBus module...
> sip:
>
/var/tmp/portage/dev-python/PyQt4-4.9_pre20111201/work/PyQt-x11-gpl-snapshot-4.9-ee8b9c7eb565-2.7/sip/QtDBus/qdbusextratypes.sip:95:
>
> A class, exception, namespace or mapped type has already been defined
> with the same name
> Error: Unable to create the C++ code.
Make sure you are using the latest SIP snapshot.
>> I propose that marshalling of composite types uses QDBusArgument (as
you
>> do in C++). However I propose that demarshalling is done automatically,
>> because...
>>
>> 1. It is Pythonic.
>> 2. The QDBusArgument API will need changing in Python if it is to
support
>> both marshalling and demarshalling.
>>
>> There remains a question of how far to demarshall automatically. At the
>> moment your example will return a Python list of QDBusObjectPath
>> instances.
>> As QDBusObjectPath is just a thin wrapper around QString should this be
>> removed and just the string returned? The same would apply to
>> QDBusSignature and QDBusVariant. Is it important to be able to
>> distinguish
>> between a return value that is a simple string and one that is an
object
>> path?
>
> I'm no dbus expert but certainly I would use the QDBusObjectPath
> instances just as plain strings. Looks like the only advantage is when
> creating QDBusObjectPath it will do some checking for you.
QDBusObjectPath would still be used when marshalling arguments.
>> As far as marshalling with QDBusArgument is concerned, I'm inclined to
>> ignore the shift operators and to implement explicit writeInt32(),
>> writeUInt32() etc methods - as happens with QDataStream.
>
> Bit beyond me. N.B. if you're not following it there has been some
> activity on
> https://bugs.freedesktop.org/show_bug.cgi?id=26420
> still a bit of a long shot in terms of dbus-python being resurrected for
> Python 3 maybe but some discussion on types.
The other question I forgot to ask is so you have an examples of methods
that return a map and a structure?
Phil
More information about the PyQt
mailing list