Python 3.x 如何在PyQt5中将字符串数组传递给dbus?
我试图使用python3.4和pyqt5.4对java编写的守护进程进行dbus调用,我调用的方法的守护进程的签名是Python 3.x 如何在PyQt5中将字符串数组传递给dbus?,python-3.x,dbus,pyqt5,qt5.4,Python 3.x,Dbus,Pyqt5,Qt5.4,我试图使用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('si
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'>
print(filepath)->['/home/svalo/programmi/devel/pythondeps']
打印(选项)->{'pin':'12345678','outdir':'/home/svalo/programmi/devel/firmapiu gui'}
打印(类型(文件路径))->
打印(类型(选项))->
然而,当我监视dbus时,我得到的是
method call sender=:1.242 -> dest=it.libersoft.FirmapiuDInterface serial=67 path=/it/libersoft/FirmapiuD; interface=it.libersoft.FirmapiuDInterface; member=sign
array [
variant string "/home/svalo/programmi/devel/firmapiu-gui/pythondeps"
]
array [
dict entry(
string "outdir"
variant string "/home/svalo/programmi/devel/firmapiu-gui"
)
dict entry(
string "pin"
variant string "12345678"
)
]
方法调用发送方=: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”
)
口述条目(
字符串“pin”
变量字符串“12345678”
)
]
我想要的是
method call sender=:1.242 -> dest=it.libersoft.FirmapiuDInterface serial=67 path=/it/libersoft/FirmapiuD; interface=it.libersoft.FirmapiuDInterface; member=sign
array [
string "/home/svalo/programmi/devel/libersoft/firmapiu-gui/pythondeps"
]
array [
dict entry(
string "outdir"
variant string "/home/svalo/programmi/devel/libersoft/firmapiu-gui"
)
dict entry(
string "pin"
variant string "12345678"
)
]
方法调用发送方=: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”
)
口述条目(
字符串“pin”
变量字符串“12345678”
)
]
也就是说,我希望python发送一个字符串数组,而不是发送一个包含字符串的变量数组。
守护进程devel用java编写了一个简单的客户机,它的工作方式是尊重签名
这里缺少什么?根据,字符串类型定义如下:
字符串115(ASCII's')UTF-8字符串(必须是有效的UTF-8)。必须以nul结尾,并且不包含其他nul字节
这似乎意味着您应该传递UTF-8编码字节对象,而不是unicode对象
编辑:
您可能需要将其作为QByteArray
传递:
QtCore.QByteArray(unicode_string.encode('utf-8'))
5年后,一个答案出现了 可以使用
QDbusArgument
指定dbus参数的类型签名。下面是一个例子:
filepath=QDBusArgument()
添加(['/home/svalo/programmi/devel/pythondeps'],QMetaType.QStringList)
结果=fpiudaemon.call('sign',filepath,options)
显然,要确保数据可以直接转换为指定的类型 好的,我尝试了
arrfoo=bytearray('string','utf-8')
并使用arrfoo
而不是filepath作为参数调用result,但它给出了一个封送失败:未注册的类型PyQt\u PyObject传入了参数
dbus@svalo. 您可能需要使用QByteArray
(请参阅我的更新答案)。我自己无法测试,所以很抱歉猜测。这似乎很奇怪,PyQt并没有自动处理这一问题——也许某个地方有个bug?好的,谢谢。我尝试了foo='test'
,test=QByteArray(foo.encode('utf-8'))
,print(type(test))->
,用result=self.fpiudaemon.call('sign',[test],options)调用它,给出了接口;member=符号数组[变量字节数组“test”]
因此也不是string@svalo. 嗯,我的直觉是它要么是一个bug,要么是一个非常非常不直观的API。从最初的示例中,很明显PyQt能够创建非变量字符串,因为它们用于dict输入键。它似乎只是数组元素和dict条目值被转换为变量。我想知道容器外的字符串值是否也转换为变量?如果不是,它似乎强烈地暗示了某种bug(或错误特性)。我成功地将字符串发送到容器外部,dbus将其视为字符串而不是变体字符串,所以,是的,也许你是对的。我会问PyQt的人不要在几篇文章中发表相同的答案,相反,如果你有特权,你应该将问题标记为重复。我想我没有。这个问题是我在谷歌上查询这个问题的唯一结果,所以我想确保任何登陆这里的人都能得到答案。好吧,为此,你回答自己的问题就足够了,因为其他人会以你找到这个问题的方式找到你的答案。