2

我正在尝试使用 python3.4 和 pyqt5.4 对 java 编写的守护进程进行 dbus 调用,我正在调用的方法的守护进程的签名是asa{sv}

我正在打的电话是

fpiudaemon = QDBusInterface("it.libersoft.FirmapiuDInterface", "/it/libersoft/FirmapiuD", interface='it.libersoft.FirmapiuDInterface' , parent=None)
result = fpiudaemon.call('sign',filepath,options)

在哪里

print (filepath) -> ['/home/svalo/programmi/devel/pythondeps']
print (options) -> {'pin': '12345678', 'outdir': '/home/svalo/programmi/devel/firmapiu-gui'}

print(type(filepath)) -> <class 'list'>
print(type(options)) -> <class 'dict'>

但是,当我监控 dbus 时,我得到的是

方法调用 sender=:1.242 -> dest=it.libersoft.FirmapiuDInterface serial=67 path=/it/libersoft/FirmapiuD; 接口=it.libersoft.FirmapiuDInterface;成员=签名
   大批 [
      变体字符串“/home/svalo/programmi/devel/firmapiu-gui/pythondeps”
   ]
   大批 [
      字典条目(
         字符串“outdir”
         变体字符串“/home/svalo/programmi/devel/firmapiu-gui”
      )
      字典条目(
         字符串“针”
         变体字符串“12345678”
      )
   ]

我想得到的是

方法调用 sender=:1.242 -> dest=it.libersoft.FirmapiuDInterface serial=67 path=/it/libersoft/FirmapiuD; 接口=it.libersoft.FirmapiuDInterface;成员=签名
   大批 [
      字符串“/home/svalo/programmi/devel/libersoft/firmapiu-gui/pythondeps”
   ]
   大批 [
      字典条目(
         字符串“outdir”
         变体字符串“/home/svalo/programmi/devel/libersoft/firmapiu-gui”
      )
      字典条目(
         字符串“针”
         变体字符串“12345678”
      )
   ]

那就是我希望python发送一个字符串数组,而不是发送一个包含字符串的变量数组。

守护进程开发者用 java 编写了一个简单的客户端,它可以兑现签名

我在这里想念什么?

4

2 回答 2

0

根据dbus-spec,字符串类型定义如下:

STRING 115 (ASCII 's') UTF-8 字符串(必须是有效的 UTF-8)。必须以 nul 结尾且不包含其他 nul 字节。

这似乎意味着您应该传递一个 UTF-8 编码的字节对象,而不是一个 unicode 对象。

编辑

您可能需要将此作为QByteArray

QtCore.QByteArray(unicode_string.encode('utf-8'))
于 2015-01-22T01:20:43.693 回答
0

5年后,答案出现了!

您可以使用 指定 dbus 参数的类型签名QDbusArgument。这是一个例子:

filepath = QDBusArgument()
filepath.add(['/home/svalo/programmi/devel/pythondeps'], QMetaType.QStringList)
result = fpiudaemon.call('sign',filepath,options)

显然要确保你的数据可以直接转换成你指定的类型。

于 2020-01-06T05:57:42.163 回答