2013-04-25 5 views
7

una domanda metodologia:comunicazione tra due script python

Ho uno script "principale" python che gira su un ciclo infinito sul mio sistema, e voglio inviare le informazioni ad esso (una stringa di dati JSON per esempio) occasionalmente con altri script python che verranno avviati successivamente da me stesso o da un altro programma e terminano subito dopo l'invio della stringa.

Non riesco a utilizzare il sottoprocesso qui perché il mio script principale non sa quando l'altro verrà eseguito e quale codice eseguiranno.

Sto pensando di far ascoltare lo script principale su una porta locale e facendo in modo che gli altri script inviino le stringhe su quella porta, ma c'è un modo migliore per farlo?

+0

Gli zoccoli sono un'opzione, ma ce ne sono altri a seconda del sistema operativo in uso. – Aya

risposta

10

zeromq: http://www.zeromq.org/ - è la soluzione migliore per imho comunicazioni tra processi e hanno un eccellente vincolante per Python: http://www.zeromq.org/bindings:python

+1

Sì, davvero una buona soluzione. – Denis

+0

Grazie mille! Non volevo usare http o anche tcp perché pensavo che il mio problema non fosse legato al networking, la soluzione ipc con zeromq è perfetta :) – Dettorer

+0

divertiti ragazzi! tre anni fa, è diventato per me un proiettile d'argento;)) –

4

Poiché lo script "principale" si presenta come un servizio che si può migliorare con un'API web. bottle è la soluzione perfetta per questo. Con questo codice aggiuntivo lo script python è in grado di ricevere le richieste ed elaborarli:

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) 

Lo script client può utilizzare il httplib per inviare un messaggio al server e leggere la risposta:

import httplib 

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

Come posso inviare richieste a questo servizio dallo script python del client? – Noah

+1

@Noah Vedi le mie aggiunte nella risposta – mike

1

In Nel caso in cui sei interessato all'implementazione dello script client presentato da Mike in Python 3.x, troverai rapidamente che non è disponibile alcun httplib. Fortunatamente, la stessa cosa è fatta con la libreria http.client.

altrimenti è lo stesso:

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

Anche se questo è vecchio vorrei capire vorrei pubblicare questo da quando ho avuto una domanda simile oggi, ma utilizzando un server.