两个Python脚本之间的通信

27

一道方法论问题:

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

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

我考虑让主脚本侦听本地端口,并让其他脚本在该端口上向其发送字符串,但是否有更好的方法来完成它?


套接字是一种选择,但取决于您使用的操作系统,还有其他选项。 - Aya
3个回答

22

太好了,谢谢!我不想使用http或tcp,因为我认为我的问题与网络无关,使用zeromq的ipc解决方案非常完美 :) - Dettorer
1
享受吧,伙计们!三年前,它对我来说成为了一颗银弹;)) - Vladimir Muzhilov
1
这个库轻量级吗?我会每秒发送数百条消息。 - resolver101

6

如果您有兴趣在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)

虽然这篇文章有些旧,但是我觉得还是应该发一下,因为今天我也遇到了类似的问题,只不过是在使用服务器时。


5

由于“主”脚本看起来像是一个服务,因此您可以使用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'

我如何从客户端Python脚本向此服务发送请求? - Noah
1
@Noah,请查看我在答案中的添加。 - mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接