Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在PyQt5中将字符串数组传递给dbus?_Python 3.x_Dbus_Pyqt5_Qt5.4 - Fatal编程技术网

Python 3.x 如何在PyQt5中将字符串数组传递给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

我试图使用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'>
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的人不要在几篇文章中发表相同的答案,相反,如果你有特权,你应该将问题标记为重复。我想我没有。这个问题是我在谷歌上查询这个问题的唯一结果,所以我想确保任何登陆这里的人都能得到答案。好吧,为此,你回答自己的问题就足够了,因为其他人会以你找到这个问题的方式找到你的答案。