5

I have 2 Python programs. I just want to send a message (a long string) from the one to the other, and I want use dbus. Now, is there an easy way to do this?

For example, if the message is very small, I have partially solved the problem putting the message in the path. But then I had to use the external program dbus-send:

Server (python):

import dbus,gtk
from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
def msg_handler(*args,**keywords):
    try:
        msg=str(keywords['path'][8:])
        #...do smthg with msg
        print msg
    except:
        pass

bus.add_signal_receiver(handler_function=msg_handler, dbus_interface='my.app', path_keyword='path')
gtk.main()

Client (bash:( ):

dbus-send --session /my/app/this_is_the_message my.app.App

Is there a way to write the client in Python? or also, is there a better way to achieve the same result?

1 Answer 1

15

Here is an example that uses interface method calls:

Server:

#!/usr/bin/python3

#Python DBUS Test Server
#runs until the Quit() method is called via DBUS

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop

class MyDBUSService(dbus.service.Object):
    def __init__(self):
        bus_name = dbus.service.BusName('org.my.test', bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, bus_name, '/org/my/test')

    @dbus.service.method('org.my.test')
    def hello(self):
        """returns the string 'Hello, World!'"""
        return "Hello, World!"

    @dbus.service.method('org.my.test')
    def string_echo(self, s):
        """returns whatever is passed to it"""
        return s

    @dbus.service.method('org.my.test')
    def Quit(self):
        """removes this object from the DBUS connection and exits"""
        self.remove_from_connection()
        Gtk.main_quit()
        return

DBusGMainLoop(set_as_default=True)
myservice = MyDBUSService()
Gtk.main()

Client:

#!/usr/bin/python3

#Python script to call the methods of the DBUS Test Server

import dbus

#get the session bus
bus = dbus.SessionBus()
#get the object
the_object = bus.get_object("org.my.test", "/org/my/test")
#get the interface
the_interface = dbus.Interface(the_object, "org.my.test")

#call the methods and print the results
reply = the_interface.hello()
print(reply)

reply = the_interface.string_echo("test 123")
print(reply)

the_interface.Quit()

Output:

$ ./dbus-test-server.py &
[1] 26241
$ ./dbus-server-tester.py 
Hello, World!
test 123

Hope that helps.

Sign up to request clarification or add additional context in comments.

1 Comment

I hoped not to create any new service class... anyway thank you.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.