[PyQt] QtDBus: Unable to convert Array of Object Paths

Phil Thompson phil at riverbankcomputing.com
Wed Nov 30 16:37:59 GMT 2011


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.

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?

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.

Thoughts?

Phil


More information about the PyQt mailing list