29

a methodology question:

I have a "main" python script which runs on an infinite loop on my system, and I want to send information to it (a json data string for example) occasionally with some other python scripts that will be started later by myself or another program and will end just after sending the string.

I can't use subprocess here because my main script doesn't know when the other will run and what code they will execute.

I'm thinking of making the main script listen on a local port and making the other scripts send it the strings on that port, but is there a better way to do it ?

1
  • Sockets is one option, but there are others depending on which OS you're using. Commented Apr 25, 2013 at 11:17

3 Answers 3

25

zeromq: http://www.zeromq.org/ - is best solution for interprocess communications imho and have a excelent binding for python: http://www.zeromq.org/bindings:python

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

3 Comments

That's great thanks! I didn't want to use http or even tcp because I thought my problem wasn't related to networking, the ipc solution with zeromq is perfect :)
enjoy guys! three years ago, it became for me a silver bullet ;))
Is this library lightweight, i will be sending 100's of messages a seconds?
6

In case you are interested in implementing the client script that Mike presented in Python 3.x, you will quickly find that there is no httplib available. Fortunately, the same thing is done with the library http.client.

Otherwise it is the same:

import http.client
c = http.client.HTTPConnection('localhost', 8080)
c.request('POST', '/process', '{}')
doc = c.getresponse().read()
print(doc)

Though this is old I would figure I would post this since I had a similar question today but using a server.

Comments

5

Since the "main" script looks like a service you can enhance it with a web API. bottle is the perfect solution for this. With this additional code your python script is able to receive requests and process them:

import json

from bottle import run, post, request, response

@post('/process')
def my_process():
  req_obj = json.loads(request.body.read())
  # do something with req_obj
  # ...
  return 'All done'

run(host='localhost', port=8080, debug=True)

The client script may use the httplib to send a message to the server and read the response:

import httplib

c = httplib.HTTPConnection('localhost', 8080)
c.request('POST', '/process', '{}')
doc = c.getresponse().read()
print doc
# 'All done'

2 Comments

How do I send requests to this service from the client python script?
@Noah See my additions in the answer

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.