因此,我已经能够从python脚本中提取两个非常有价值的功能。第一个是从命令行运行python函数作为服务的能力。假设python脚本为了简单起见而采用命令行参数。有点像:
import sys
def foo():
return "%s is your last argument!" % sys.argv[-1]
foo()
然后我将通过运行python file.py somearg
全局访问,此外,我可以编写一个supervisord脚本来守护脚本并使其在内存中运行。我现在发现自己处于一个我需要同时使用这两个功能的位置,而且我不确定从哪里开始。为清楚起见,我基本上都有以下几点:
if __name__ == "__main__":
big_file = open(slow_loader)
foo(big_file)
理想情况下,一旦运行,我会将整个big_file
保留在内存中,并且能够通过运行类似于原始内容的foo
来访问big_file
方法python file.py somearg
。我不确定如何从这里进步。
任何帮助,即使它只是指向某些文档的链接也会非常有帮助。提前,我意识到我可以将它包装在浅烧瓶应用程序中并通过http
请求运行它,但是出于NDA的原因,我需要通过内部shell命令运行的东西。
答案 0 :(得分:2)
因为我喜欢zmq和gevent,我可能会这样做:
server.py
import gevent
import gevent.monkey
gevent.monkey.patch_all()
import zmq.green as zmq
import json
context = zmq.Context()
socket = context.socket(zmq.ROUTER)
socket.bind("ipc:///tmp/myapp.ipc")
def do_something(parsed):
return sum(parsed.get("values"))
def handle(msg):
data = msg[1]
parsed = json.loads(data)
total = do_something(parsed)
msg[1] = json.dumps({"response": total})
socket.send_multipart(msg)
def handle_zmq():
while True:
msg = socket.recv_multipart()
gevent.spawn(handle, msg)
if __name__ == "__main__":
handle_zmq()
然后你会有一个client.py用于你的命令行工具,比如
import json
import zmq
request_data = {
"values": [10, 20, 30 , 40],
}
context = zmq.Context()
socket = context.socket(zmq.DEALER)
socket.connect("ipc:///tmp/myapp.ipc")
socket.send(json.dumps(request_data))
print socket.recv()
显然这是一个人为的例子,但你应该明白这个想法。或者你可以使用像xmlrpc或jsonrpc这样的东西。