Как отправить беззнаковые значения в dBus из Python
Я пытаюсь использовать модуль DBus PyQt5 для взаимодействия с KDE PowerManagerAgent. При вызове метода AddInhibo мне нужно отправить первый параметр в виде uint32 (Unsigned int), но код отправляет значение в виде целого числа.
Код написан с использованием Python 3
self.dBus = QtDBus.QDBusConnection.sessionBus()
msg = QtDBus.QDBusMessage.createMethodCall(self.dBusService, self.dBusPath,self.dBusInterface,'AddInhibition')
msg << 1 << who << reason
reply = QtDBus.QDBusReply(self.dBus.call(msg))
Глядя на выходные данные dbus-monitor, я могу сказать, что код действительно связывается с powermonitor, но не может найти правильный метод AddInhibation из-за того, что первый параметр имеет тип int32
Вывод из dbus-монитора при попытке вызвать AddIn икс
Вызов
время вызова метода =1549706946.073218 sender=:1.172 -> destination=org.kde.Solid.PowerManagement.PolicyAgent serial=5 path=/org/kde/Solid/PowerManagement/PolicyAgent; Интерфейс =org.kde.Solid.PowerManagement.PolicyAgent; member=AddIngression int32 1 строка "Эта" строка "не удается"
Ответить
время ошибки =1549706946.073536 отправитель =:1.29 -> назначение =:1.172 error_name=org.freedesktop.DBus.Error.UnknownMethod reply_serial=5 строка "Нет такого метода" AddInhibin "в интерфейсе" org.kde.Solid.PowerManagement.PolicyAgent "в путь к объекту '/org/kde/Solid/PowerManagement/PolicyAgent' (подпись 'iss')"
Вывод из dbus-монитора при использовании приложения QDBusViewer
Вызов
время вызова метода =1549723045.320128 отправитель =:1.82 -> destination=org.kde.Solid.PowerManagement.PolicyAgent serial=177 path=/org/kde/Solid/PowerManagement/PolicyAgent; Интерфейс =org.kde.Solid.PowerManagement.PolicyAgent; member=AddInhibition uint32 1 строка "Эта" строка "Работает"
Ответить
время возврата метода =1549723045.320888 отправитель =: 1,29 -> пункт назначения =: 1,82 серийный =1370 reply_serial=177 uint32 30
Поскольку Python не является строго типизированным, как мне указать, что параметр должен быть введен как беззнаковое целое?
0 ответов
Вы можете использовать DBusArgument
класс, чтобы сделать это, указав QMetaType
аргумента.
Например, вы хотите использовать RequestName
метод от org.freedesktop.DBus
(см. спецификацию). Вflags
Аргумент - это целое число без знака, поэтому вы столкнетесь с этой проблемой:
>>> from PyQt5.QtDBus import QDBusConnection, QDBusInterface
>>> sessionbus = QDBusConnection.sessionBus()
>>> iface = QDBusInterface("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", sessionbus)
>>> c = iface.call('RequestName', 'com.mydomain.myapp', 4)
>>> c.arguments()
['Call to RequestName has wrong args (si, expected su)\n']
Итак, он говорит, что у него есть строка и целое число (si
), но ему нужна была строка и целое число без знака (su
). Итак, мы будем использоватьQDBusArgument
класс и указать QMetaType.UInt
:
>>> from PyQt5.QtCore import QMetaType
>>> from PyQt5.QtDBus import QDBusConnection, QDBusInterface, QDBusArgument
>>> sessionbus = QDBusConnection.sessionBus()
>>> iface = QDBusInterface("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", sessionbus)
>>> a1 = QDBusArgument()
>>> a1.add('com.mydomain.myapp', QMetaType.QString)
>>> a2 = QDBusArgument(4, QMetaType.UInt)
>>> c = iface.call('RequestName', a1, a2)
>>> c.arguments()
[1]
Поскольку струна была в порядке, это не обязательно QDBusArgument
. Я просто хотел показать два способа его создания (с.add()
метод и просто с помощью конструктора).