2013-04-25 49 views
7

câu hỏi về phương pháp:Giao tiếp giữa hai kịch bản python

Tôi có tập lệnh python "chính" chạy trên một vòng lặp vô hạn trên hệ thống của mình và tôi muốn gửi thông tin đến nó (ví dụ: chuỗi dữ liệu json) đôi khi với một số tập lệnh python khác sẽ được bắt đầu sau đó bởi chính tôi hoặc chương trình khác và sẽ kết thúc ngay sau khi gửi chuỗi.

Tôi không thể sử dụng quy trình con tại đây vì tập lệnh chính của tôi không biết khi nào mã lệnh khác sẽ chạy và mã nào sẽ thực thi.

Tôi đang nghĩ đến việc làm cho tập lệnh chính lắng nghe trên một cổng cục bộ và làm cho các tập lệnh khác gửi cho nó các chuỗi trên cổng đó, nhưng có cách nào tốt hơn để làm điều đó không?

+0

Ổ cắm là một tùy chọn, nhưng có những tùy chọn khác tùy thuộc vào hệ điều hành bạn đang sử dụng. – Aya

Trả lời

10

zeromq: http://www.zeromq.org/ - là giải pháp tốt nhất cho IMHO truyền thông interprocess và có một xuất sắc ràng buộc cho python: http://www.zeromq.org/bindings:python

+1

Đúng, giải pháp thực sự tốt. – Denis

+0

Thật tuyệt vời! Tôi không muốn sử dụng http hoặc thậm chí tcp vì tôi nghĩ rằng vấn đề của tôi không liên quan đến mạng, giải pháp ipc với zeromq là hoàn hảo :) – Dettorer

+0

tận hưởng các chàng trai! ba năm trước, nó đã trở thành cho tôi một viên đạn bạc;)) –

4

Kể từ khi "chính" kịch bản trông giống như một dịch vụ mà bạn có thể nâng cao nó với một API web. bottle là giải pháp hoàn hảo cho việc này. Với mã bổ sung này script python của bạn có thể nhận được yêu cầu và xử lý chúng:

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) 

Các kịch bản khách hàng có thể sử dụng httplib để gửi một thông điệp tới máy chủ và đọc các phản ứng:

import httplib 

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

Làm cách nào để gửi yêu cầu đến dịch vụ này từ tập lệnh python của ứng dụng khách? – Noah

+1

@Noah Xem phần bổ sung của tôi trong câu trả lời – mike

1

Trong trường hợp bạn quan tâm đến việc triển khai kịch bản lệnh khách mà Mike trình bày trong Python 3.x, bạn sẽ nhanh chóng thấy rằng không có httplib có sẵn. May mắn thay, điều tương tự cũng được thực hiện với thư viện http.client.

Nếu nó là như nhau:

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

Mặc dù đây là tuổi tôi sẽ tìm tôi sẽ đăng bài này vì tôi đã có một câu hỏi tương tự ngày nay nhưng sử dụng một máy chủ.

Các vấn đề liên quan