Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2008 12:51:21

cvetik
От:
Зарегистрирован: 2008-07-22
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

dbus вызов метода

Всем душевное ЗДРАВСТВУЙТЕ!
Решила попробоавть 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?



Офлайн

#2 Авг. 29, 2008 14:01:30

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

dbus вызов метода

правильно так

import dbus

bus = dbus.SessionBus()
obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, 'org.myHelpdesk')
print iface.do()
у вас 2 ошибки
первая то что вы делаете сервер в сессионной шине а спрашиваете в системной
вторая вы путаете адрес с объектом



Отредактировано (Авг. 29, 2008 14:12:23)

Офлайн

#3 Авг. 29, 2008 14:37:44

cvetik
От:
Зарегистрирован: 2008-07-22
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

dbus вызов метода

Спасибо огромное!!!!И еще большее спасибо за то, что указал на ошибки…потому что я бы наверное сама еще долго понимала причину…на счет второй ошибки я поняла, а вот про первую даже не подозревала…



Офлайн

#4 Авг. 29, 2008 16:47:04

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

dbus вызов метода

А есть документация про эту технологию на русском?

..bw



Офлайн

#5 Авг. 29, 2008 16:57:39

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

dbus вызов метода

здесь немного старая версия но вобщем это поможет в понимании
http://www.opennet.ru/base/sys/dbus_intro.txt.html



Офлайн

#6 Авг. 29, 2008 17:14:59

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

dbus вызов метода

для опытов можеш немного модифицировать сервер от светика
примерно так

#!/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)

Офлайн

#7 Авг. 29, 2008 17:20:28

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

dbus вызов метода

Я пока не начал разбираться с D-BUS, но такие записи немного шокируют и ввобят в ступор:

obj = bus.get_object('org.myHelpdesk', '/org/myHelpdesk')
iface = dbus.Interface(obj, 'org.myHelpdesk')
Я о явном повторении имен org.myHelpdesk, /org/myHelpdesk и org.myHelpdesk.

..bw



Офлайн

#8 Авг. 29, 2008 17:25:18

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

dbus вызов метода

шина это пространство имён
чтобы найти нужный сервер нужен адрес это /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)

Офлайн

#9 Авг. 29, 2008 17:38:28

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

dbus вызов метода

> по этому адресу моэно получать объекты сервера например объект 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



Офлайн

#10 Сен. 1, 2008 09:07:06

evgenyl
От:
Зарегистрирован: 2008-07-22
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

dbus вызов метода

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



Отредактировано (Сен. 1, 2008 09:07:31)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version