2015-01-21 4 views
2

Я пытаюсь сделать вызов Dbus используя python3.4 и pyqt5.4 на Java написанного демона, подпись демона для метода я звоню является asa{sv}Как передать массив строк в dbus в PyQt5?

вызова я делаю является

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, что я получаю

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" 
    ) 
    ]

Что я хотел бы получить это

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" 
    ) 
    ]

То есть я ожидаю питон отправить массив строк, и вместо этого он посылает массив вариантов, содержащих строку.

Демон разви написал простой клиент в Java и работает чествования подпись

Что я здесь отсутствует?

ответ

0

Согласно dbus-spec, строка типа определяется следующим образом:

СТРОКА 115 (ASCII 'с') UTF-8, строка (должен быть действителен в UTF-8). Должен быть nul завершен и не содержит других nul байтов.

Который, кажется, подразумевает, что вы должны передать UTF-8 кодируются байт объект, а не объект Юникода.

EDIT:

Вам может понадобиться пройти это как QByteArray:

QtCore.QByteArray(unicode_string.encode('utf-8')) 
+0

Хорошо, я судимое 'arrfoo = ByteArray, ('строка', 'UTF-8')' и вызова результат с 'arrfoo' вместо filepath как аргумент, но он дает« Marshalling failed: Unregistered type PyQt_PyObject, переданный в аргументы », даже не доходя до dbus – svalo

+0

@svalo. Возможно, вам придется использовать 'QByteArray' (см. Мой обновленный ответ). Я не могу проверить это сам, так что извините за догадки. Кажется странным, что PyKt автоматически не обрабатывается - может быть, где-то есть ошибка? – ekhumoro

+0

Хорошо, спасибо. Я попробовал 'foo = 'test'',' test = QByteArray (foo.encode (' utf-8 ')) ',' print (type (test)) -> ', называя его 'result = self.fpiudaemon.call ('sign', [test], options)' дает интерфейс; member = sign массив [ вариант массива байтов «test»] 'и так еще раз не массив строки – svalo

Смежные вопросы