web-dev-qa-db-ja.com

2つのpythonスクリプト間の通信

方法論の質問:

システムの無限ループで実行される「メイン」pythonスクリプトがあり、他のpythonと一緒に情報(jsonデータ文字列など)を送信したい場合があります。 _後で自分自身または別のプログラムによって開始され、文字列を送信した直後に終了するスクリプト。

メインスクリプトは、他のスクリプトがいつ実行され、どのコードが実行されるかを知らないため、ここではサブプロセスを使用できません。

メインスクリプトにローカルポートでリッスンさせ、他のスクリプトにそのポートで文字列を送信させることを考えていますが、それを行うためのより良い方法はありますか?

11
Dettorer

zeromq: http://www.zeromq.org/ -プロセス間通信imhoに最適なソリューションであり、Python用の優れたバインディングがあります: http://www.zeromq.org/bindings :python

14

「メイン」スクリプトはサービスのように見えるので、WebAPIを使用して拡張できます。 bottle はこれに対する完璧な解決策です。この追加コードを使用すると、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'
4
mike

MikeがPython 3.xで提示したクライアントスクリプトの実装に興味がある場合は、利用可能なhttplibがないことがすぐにわかります。幸い、ライブラリhttpでも同じことが行われます。 。クライアント。

それ以外は同じです:

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

これは古いですが、今日同様の質問がありましたがサーバーを使用しているので、これを投稿すると思います。

3