一道方法论问题:
我有一个“主”Python脚本,它在我的系统上无限循环运行,我想偶尔通过其他一些Python脚本向其发送信息(例如JSON数据字符串),这些脚本稍后由我或另一个程序启动,并在发送字符串后立即结束。
我不能在这里使用subprocess,因为我的主脚本不知道其他脚本何时运行以及它们将执行什么代码。
我考虑让主脚本侦听本地端口,并让其他脚本在该端口上向其发送字符串,但是否有更好的方法来完成它?
一道方法论问题:
我有一个“主”Python脚本,它在我的系统上无限循环运行,我想偶尔通过其他一些Python脚本向其发送信息(例如JSON数据字符串),这些脚本稍后由我或另一个程序启动,并在发送字符串后立即结束。
我不能在这里使用subprocess,因为我的主脚本不知道其他脚本何时运行以及它们将执行什么代码。
我考虑让主脚本侦听本地端口,并让其他脚本在该端口上向其发送字符串,但是否有更好的方法来完成它?
zeromq:http://www.zeromq.org/ - 在我看来,它是进程间通信的最佳解决方案,并且具有出色的Python绑定:http://www.zeromq.org/bindings:python
如果您有兴趣在Python 3.x中实现Mike呈现的客户端脚本,您会很快发现没有httplib可用。幸运的是,使用http.client库可以实现同样的功能。
其他方面都是相同的:
import http.client
c = http.client.HTTPConnection('localhost', 8080)
c.request('POST', '/process', '{}')
doc = c.getresponse().read()
print(doc)
虽然这篇文章有些旧,但是我觉得还是应该发一下,因为今天我也遇到了类似的问题,只不过是在使用服务器时。
由于“主”脚本看起来像是一个服务,因此您可以使用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)
import httplib
c = httplib.HTTPConnection('localhost', 8080)
c.request('POST', '/process', '{}')
doc = c.getresponse().read()
print doc
# 'All done'