Связь между двумя скриптами python

методология вопрос:

У меня есть" основной " скрипт python, который работает в бесконечном цикле в моей системе, и я хочу отправлять ему информацию (например, строку данных json) иногда с некоторыми другими скриптами python, которые будут запущены позже мной или другой программой и закончатся сразу после отправки строки.

Я не могу использовать подпроцесс здесь, потому что мой основной скрипт не знает, когда другой будет работать и какой код они будут выполнять.

Я думаю о том, чтобы заставить основной скрипт слушать локальный порт и заставить другие скрипты отправлять ему строки на этом порту, но есть ли лучший способ сделать это ?

3 ответов


zeromq:http://www.zeromq.org/ - это лучшее решение для межпроцессных коммуникаций imho и имеет отличную привязку для python:http://www.zeromq.org/bindings:python


поскольку" основной " скрипт выглядит как сервис, вы можете улучшить его с помощью веб-API. бутылки является идеальным решением для этого. С помощью этого дополнительного кода ваш скрипт python может получать запросы и обрабатывать их:

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)

клиентский скрипт может использовать httplib для отправки сообщения на сервер и чтения ответа:

import httplib

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

в случае, если вы заинтересованы в реализации клиентского скрипта, который Майк представил в Python 3.x, вы быстро обнаружите, что httplib недоступен. К счастью, то же самое делается с библиотека http.клиент.

в противном случае это то же самое:

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

хотя это старый, я бы подумал, что опубликую это, так как у меня был аналогичный вопрос сегодня, но с использованием сервера.