Как отправить беззнаковые значения в 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() метод и просто с помощью конструктора).

Другие вопросы по тегам