Форум сайта python.su
Всем душевное ЗДРАВСТВУЙТЕ!
Решила попробоавть 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()
bus = dbus.SystemBus()
obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, '/org/myHelpdesk')
iface.get_dbus_method('do')
Офлайн
правильно так
import dbus
bus = dbus.SessionBus()
obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, 'org.myHelpdesk')
print iface.do()
Отредактировано (Авг. 29, 2008 14:12:23)
Офлайн
Спасибо огромное!!!!И еще большее спасибо за то, что указал на ошибки…потому что я бы наверное сама еще долго понимала причину…на счет второй ошибки я поняла, а вот про первую даже не подозревала…
Офлайн
А есть документация про эту технологию на русском?
..bw
Офлайн
здесь немного старая версия но вобщем это поможет в понимании
http://www.opennet.ru/base/sys/dbus_intro.txt.html
Офлайн
для опытов можеш немного модифицировать сервер от светика
примерно так
#!/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()
Отредактировано (Авг. 29, 2008 17:22:14)
Офлайн
Я пока не начал разбираться с D-BUS, но такие записи немного шокируют и ввобят в ступор:
obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, 'org.myHelpdesk')
Офлайн
шина это пространство имён
чтобы найти нужный сервер нужен адрес это /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 - у объекта может быть много интерфейсов с разными именами
Отредактировано (Авг. 29, 2008 17:30:46)
Офлайн
> по этому адресу моэно получать объекты сервера например объект 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
Офлайн
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
Отредактировано (Сен. 1, 2008 09:07:31)
Офлайн