Communicating with a running python daemon Communicating with a running python daemon python python

Communicating with a running python daemon


Yet another approach: use Pyro (Python remoting objects).

Pyro basically allows you to publish Python object instances as services that can be called remotely. I have used Pyro for the exact purpose you describe, and I found it to work very well.

By default, a Pyro server daemon accepts connections from everywhere. To limit this, either use a connection validator (see documentation), or supply host='127.0.0.1' to the Daemon constructor to only listen for local connections.

Example code taken from the Pyro documentation:

Server

import Pyro.coreclass JokeGen(Pyro.core.ObjBase):        def __init__(self):                Pyro.core.ObjBase.__init__(self)        def joke(self, name):                return "Sorry "+name+", I don't know any jokes."Pyro.core.initServer()daemon=Pyro.core.Daemon()uri=daemon.connect(JokeGen(),"jokegen")print "The daemon runs on port:",daemon.portprint "The object's uri is:",uridaemon.requestLoop()

Client

import Pyro.core# you have to change the URI below to match your own host/port.jokes = Pyro.core.getProxyForURI("PYROLOC://localhost:7766/jokegen")print jokes.joke("Irmen")

Another similar project is RPyC. I have not tried RPyC.


What about having it run an http server?

It seems crazy but running a simple web server for administrating yourserver requires just a few lines using web.py

You can also consider creating a unix pipe.


Use werkzeug and make your daemon include an HTTP-based WSGI server.

Your daemon has a collection of small WSGI apps to respond with status information.

Your client simply uses urllib2 to make POST or GET requests to localhost:somePort. Your client and server must agree on the port number (and the URL's).

This is very simple to implement and very scalable. Adding new commands is a trivial exercise.

Note that your daemon does not have to respond in HTML (that's often simple, though). Our daemons respond to the WSGI-requests with JSON-encoded status objects.