2012-05-30 1 views
0

Я пытаюсь написать сервер dbus, где я хочу запустить внешнюю программу оболочки (grep здесь), чтобы выполнить эту работу.python: простой пример dbus-os.fork() в рутине обслуживания?

, когда я делаю:

проворного $ server.py

затем:

проворный $ client.py # работает хорошо, то есть. запускает команду grep в дочернем процессе.

проворная $ client.py # ..., но второй вызов производит следующее сообщение об ошибке:

DBusException: org.freedesktop.DBus.Error.ServiceUnknown: Название org.example.ExampleService не было предоставлено какой-либо .service files

Я застрял. Можете ли вы мне помочь?

здесь server.py (client.py после этого):

import gtk, glib 
import os 
import dbus 
import dbus.service 
import dbus.mainloop.glib 
import subprocess 

messages_queue=list() 
grep_pid=0 


def queue_msg(message): 
    global messages_queue 
    messages_queue.append(message) 
    return 

def dequeue_msg(): 
    global messages_queue,grep_pid 
    if grep_pid != 0: 
     try: 
      pid=os.waitpid(grep_pid,os.P_NOWAIT) 
     except: 
      return True 
     if pid[0] == 0: 
      return True 
     grep_pid=0 

    if len(messages_queue) == 0: 
      return True 
    else: 
      tekst=messages_queue.pop(0) 

     cmd="grep 'pp'" 

     print cmd 
     #works fine, when I do return here 
     #return True 

    grep_pid=os.fork() 
    if grep_pid != 0: 
     return True 
    os.setpgid(0,0) 
    pop=subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE) 
    pop.stdin.write(tekst) 
    pop.stdin.close() 
    pop.wait() 
    exit(0) 

class DemoException(dbus.DBusException): 
    _dbus_error_name = 'org.example.Exception' 

class MyServer(dbus.service.Object): 

    @dbus.service.method("org.example.ExampleInterface", 
         in_signature='', out_signature='') 
    def QueueMsg(self): 
      queue_msg("ppppp") 

    @dbus.service.method("org.example.ExampleInterface", 
         in_signature='', out_signature='') 
    def Exit(self): 
     mainloop.quit() 

from dbus.mainloop.glib import threads_init 

if __name__ == '__main__': 
     glib.threads_init() 

     threads_init() 

     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 

     session_bus = dbus.SessionBus() 
     name = dbus.service.BusName("org.example.ExampleService", session_bus) 
     object = MyServer(session_bus, '/My') 

     glib.timeout_add_seconds(1, dequeue_msg) 
     mainloop = glib.MainLoop() 
     print "Running example service." 
     mainloop.run() 

Теперь client.py:

import sys 
from traceback import print_exc 
import dbus 

def main(): 
    bus = dbus.SessionBus() 

    try: 
     remote_object = bus.get_object("org.example.ExampleService", 
             "/My") 

    except dbus.DBusException: 
     print_exc() 
     sys.exit(1) 

    iface = dbus.Interface(remote_object, "org.example.ExampleInterface") 

    iface.QueueMsg() 

    if sys.argv[1:] == ['--exit-service']: 
     iface.Exit() 

if __name__ == '__main__': 
    main() 
+1

Я изучал, как интегрировать приложение с dbus-python и наткнулся на ваш пост. В этом разделе [link] (http://developer.gnome.org/glib/2.31/glib-The-Main-Event-Loop.html) есть раздел, если вы немного прокрутите список, называемый «Настройка основной итерации цикла» ». О настройке glib mainloop;) и о том, как он несовместим с системами fork' on * nix. – tijko

ответ

0

Вы обычно получаете сообщение об ошибке при попытке получить доступ к службе, которая больше недоступно. Проверьте, работает ли ваш сервер.

Вы можете использовать d-feet для отладки ваших соединений dbus.

0

Сообщение об ошибке в файле .service означает, что вам необходимо создать служебный файл в dbus-1/services.

Например:

# /usr/local/share/dbus-1/services/org.example.ExampleService.service 
[D-BUS Service] 
Name=org.example.ExampleService 
Exec=/home/user1401567/service.py 

Многие учебники не содержат эту деталь (? Возможно .Service файлы не использовать, потребуется), но, по крайней мере, на Ubuntu 12.04, Dbus услуги может» t без него.

+0

не могли бы вы добавить некоторый учебный ресурс? Я не могу найти его через веб-поиск (я думаю, что плохо). Это работало для меня без каких-либо из этих файлов .service, но теперь внезапно перестало работать - не знаю почему. (или, возможно, даже лучше, предоставить мне подходящее ключевое слово для поиска, так что в следующий раз у меня будет больше успеха в поиске :)?) – n611x007