2013-04-25 138 views
7

的方法问题:通信Python脚本之间的两个

我有它运行在我的系统上的无限循环“主” python脚本,我想将信息发送到它(例如JSON数据串)偶尔还会有一些其他的Python脚本,这些脚本会在稍后由我自己或其他程序启动,并在发送字符串后立即结束。

我不能在这里使用子进程,因为我的主脚本不知道对方何时运行以及它们将执行什么代码。

我在考虑让主脚本在本地端口上侦听,并让其他脚本将该端口上的字符串发送给它,但有没有更好的方法来做到这一点?

+0

套接字是一种选择,但还有其他选项取决于您使用的是哪种操作系统。 – Aya 2013-04-25 11:17:47

回答

10

zeromq:http://www.zeromq.org/ - 是进程间通信恕我直言,最好的解决办法,有一个外观极好的Python绑定:http://www.zeromq.org/bindings:python

+1

是的,真的很好的解决方案。 – Denis 2013-04-25 11:23:27

+0

非常感谢!我不想使用http甚至tcp,因为我认为我的问题与网络无关,带有zeromq的ipc解决方案是完美的:) – Dettorer 2013-04-25 19:34:32

+0

享受家伙!三年前,它变成了我的一颗银子弹;)) – 2013-04-25 20:49:30

4

由于“主”脚本貌似可以使用Web API提升它的服务。 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' 
+0

如何从客户端python脚本向此服务发送请求? – Noah 2014-05-29 19:03:29

+1

@Noah看到我的补充答案 – mike 2014-05-30 16:04:59

1

在如果您有兴趣实施Mike在Python 3.x中提供的客户端脚本,您将很快发现没有可用的httplib。幸运的是,库http.client完成了同样的事情。

否则是相同的:

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

虽然这是老我会想出我会发布此,因为我今天只是使用的服务器也有类似的问题。