[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