2013-04-25 19 views
7

kwestia metodologii:Komunikacja między dwoma skrypty python

mam „głównym” skrypt Pythona, który działa na nieskończonej pętli w moim systemie i chcę wysłać informacje do niego (ciąg danych json na przykład) sporadycznie z niektórymi innymi skryptami Pythona, które będą uruchamiane później przeze mnie lub inny program i zakończą się tuż po wysłaniu łańcucha.

Nie mogę użyć podprocesu tutaj, ponieważ mój główny skrypt nie wie, kiedy drugi uruchomi się i jaki kod będzie wykonywał.

Zastanawiam się nad tym, aby główny skrypt nasłuchiwał na lokalnym porcie i sprawił, że inne skrypty wysłały mu ciągi na tym porcie, ale czy jest lepszy sposób na zrobienie tego?

+0

Gniazda są jedną z opcji, ale są inne, w zależności od używanego systemu operacyjnego. – Aya

Odpowiedz

10

zeromq: http://www.zeromq.org/ - jest najlepszym rozwiązaniem dla imho międzyprocesorowa łączności i mają Excelent wiążący dla Pythona: http://www.zeromq.org/bindings:python

+1

Tak, naprawdę dobre rozwiązanie. – Denis

+0

To wielkie dzięki! Nie chciałem używać http ani nawet tcp, ponieważ myślałem, że mój problem nie jest związany z siecią, rozwiązanie ipc z zeromq jest idealne :) – Dettorer

+0

ciesz się! trzy lata temu stała się dla mnie srebrną kulą;)) –

4

Ponieważ „main” skrypt wygląda usługi można wzbogacić go o API internetowej. bottle jest idealnym rozwiązaniem do tego. Z tego dodatkowego kodu skrypt Pythona jest zdolny do przyjmowania wniosków i przetwarza je:

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) 

Skrypt klient może korzystać z httplib aby wysłać wiadomość do serwera i przeczytać odpowiedzi:

import httplib 

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

Jak wysłać żądania do tej usługi ze skryptu python klienta? – Noah

+1

@Noah Zobacz moje dodatki w odpowiedzi – mike

1

W W przypadku, gdy jesteś zainteresowany implementacją skryptu klienta, który Mike zaprezentował w Pythonie 3.x, szybko odkryjesz, że nie ma dostępnego httplib. Na szczęście to samo robi się z biblioteką http.client.

Inaczej jest taka sama:

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

Choć jest to stary Chciałbym dowiedzieć chciałbym pisać to, ponieważ miałem dzisiaj, ale za pomocą serwera podobne pytanie.

Powiązane problemy