Найти - Пользователи
Полная версия: dbus вызов метода
Начало » Python для экспертов » dbus вызов метода
1 2
cvetik
Всем душевное ЗДРАВСТВУЙТЕ!
Решила попробоавть dbus. Меня заинтересовала возможность взаимодействия двух приложений по средством d-bus. В качесвте приложений выстпают питоновски модули, некогда мною написанные.
решила экспериментировать на неком упрощенно варианте:
есть код

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import MySQLdb
import dbus
import gobject
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
import os

main_loop = DBusGMainLoop()
bus = dbus.SessionBus(mainloop=main_loop)

DBUS_NAME = "org.myHelpdesk"
DBUS_PATH = "/org/myHelpdesk"

class Helpdesk(dbus.service.Object):
def __init__(self):
global bus
bus_name = dbus.service.BusName(DBUS_NAME, bus=bus)
dbus.service.Object.__init__(self, bus_name, DBUS_PATH)


@dbus.service.method(DBUS_NAME, in_signature='', out_signature='s')

def do(self):
conn = MySQLdb.connect(db='db', host='localhost', user='root', passwd='root')
conn.query("SET NAMES utf8")
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("SELECT `hd_thread`.`id` FROM `hd_thread` w")
rec = [r for r in cursor]
return str(rec)

class myHelpdesk:
def __init__(self):
self.loop = gobject.MainLoop()
helpdesk = Helpdesk()


def start(self):
print "run..."
try:
self.loop.run()
print "ok"
except:
print "some error"
start = myHelpdesk()
start.start()
для вызова метода do использую команду dbus-send –reply-timeout=30000 –print-reply –dest=org.myHelpdesk /org/myHelpdesk org.myHelpdesk.do
но меня интересует вызов метода по средством python-dbus
Я делаю что-то вроде:
bus = dbus.SystemBus()
obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, '/org/myHelpdesk')
iface.get_dbus_method('do')
Возникает ошибка

The name org.myHelpdesk was not provided by any .service files
Как мне правильно реализовать вызов метода из написанного мною лбъекта d-bus?
evgenyl
правильно так
import dbus

bus = dbus.SessionBus()
obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, 'org.myHelpdesk')
print iface.do()
у вас 2 ошибки
первая то что вы делаете сервер в сессионной шине а спрашиваете в системной
вторая вы путаете адрес с объектом
cvetik
Спасибо огромное!!!!И еще большее спасибо за то, что указал на ошибки…потому что я бы наверное сама еще долго понимала причину…на счет второй ошибки я поняла, а вот про первую даже не подозревала…
bw
А есть документация про эту технологию на русском?

..bw
evgenyl
здесь немного старая версия но вобщем это поможет в понимании
http://www.opennet.ru/base/sys/dbus_intro.txt.html
evgenyl
для опытов можеш немного модифицировать сервер от светика
примерно так
#!/usr/bin/python
# -*- coding: utf-8 -*-

import dbus
import gobject
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
import os

main_loop = DBusGMainLoop()
bus = dbus.SessionBus(mainloop=main_loop)

DBUS_NAME = "org.myHelpdesk"
DBUS_PATH = "/org/myHelpdesk"

class Helpdesk(dbus.service.Object):
def __init__(self):
global bus
bus_name = dbus.service.BusName(DBUS_NAME, bus=bus)
dbus.service.Object.__init__(self, bus_name, DBUS_PATH)


@dbus.service.method(DBUS_NAME, in_signature='', out_signature='s')
def do(self):
return 'Yo! Dude.'

class myHelpdesk:
def __init__(self):
self.loop = gobject.MainLoop()
helpdesk = Helpdesk()


def start(self):
print "run..."
try:
self.loop.run()
print "ok"
except:
print "some error"
start = myHelpdesk()
start.start()
bw
Я пока не начал разбираться с D-BUS, но такие записи немного шокируют и ввобят в ступор:
obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, 'org.myHelpdesk')
Я о явном повторении имен org.myHelpdesk, /org/myHelpdesk и org.myHelpdesk.

..bw
evgenyl
шина это пространство имён
чтобы найти нужный сервер нужен адрес это /org/myHelpdesk
по этому адресу можно получать объекты сервера например объект org.myHelpdesk
это просто имена, так принято называть адреса и объекты в dbus

obj = bus.get_object('org.myHelpdesk', ‘/org/myHelpdesk’) тут мы берём грубо говоря сигнатуру объекта, какбы делаем питоновский класс
iface = dbus.Interface(obj, ‘org.myHelpdesk’) а вот тут делаем экземпляр этого класса
далее можно вызвать метод этого класса
print iface.do()

который описан в сервере
class Helpdesk(dbus.service.Object):
def __init__(self):
global bus
bus_name = dbus.service.BusName(DBUS_NAME, bus=bus)
dbus.service.Object.__init__(self, bus_name, DBUS_PATH)

@dbus.service.method(DBUS_NAME, in_signature='', out_signature='s')
def do(self):
return ‘Yo! Dude.’


про явное повторение org.myHelpdesk - у объекта может быть много интерфейсов с разными именами
bw
> по этому адресу моэно получать объекты сервера например объект org.myHelpdesk
Т.е. по “своему” адресу я могу брать объекты как угодно именнованные и не будет коллизий с другими серверами (это правильный термин?)?

Например это, нормально, возможно?:
foo1 = bus.get_object('foo', ‘/org/foo’)
foo2 = bus.get_object('foo', ‘/org/bar’)

foo1 != foo2 ? И в смысле интерфейса и в смысле реализации.
Странно что объекты и интерфейсы имеют одинаковую систему именования, это сбивает с толку или тут есть тайный замысел?

В большинстве языков используются разные имена, например:
Объект - packet.module.Foo
Интерфейс - packet.module.IFoo

Причем нигде не нужно указывать еще и “адрес к ”серверу“ объекта” - /packet/module/Foo :-). Выглядит нелепо. Похоже это делали сишники не знакомые с ООП, или я чего-то не понимаю.

..bw
evgenyl
bw
> по этому адресу моэно получать объекты сервера например объект org.myHelpdesk
Т.е. по “своему” адресу я могу брать объекты как угодно именнованные и не будет коллизий с другими серверами (это правильный термин?)?

Например это, нормально, возможно?:
foo1 = bus.get_object('foo', ‘/org/foo’)
foo2 = bus.get_object('foo', ‘/org/bar’)

foo1 != foo2 ? И в смысле интерфейса и в смысле реализации.
Странно что объекты и интерфейсы имеют одинаковую систему именования, это сбивает с толку или тут есть тайный замысел?

В большинстве языков используются разные имена, например:
Объект - packet.module.Foo
Интерфейс - packet.module.IFoo

Причем нигде не нужно указывать еще и “адрес к ”серверу“ объекта” - /packet/module/Foo :-). Выглядит нелепо. Похоже это делали сишники не знакомые с ООП, или я чего-то не понимаю.

..bw
думаю колизий не будет, просто в примерах так почемуто называют, хотя это совершенно не критично имхо, хотя я не пробовал, обычно использую уже готовые сервера свои не пишу :)

вот интерфейс HAL подсистемы можеш её глянуть для сравнения
http://people.freedesktop.org/~david/hal-spec/hal-spec.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB