使用 RPyC 时重定向命令行输出

RPyC 简介

RPyC 是一个 Python 的第三方库,主要用来进行远程调用以及分布运算。具体可以看官网 http://rpyc.readthedocs.org/

本文所解决问题:

使用 RPyC 时,若在 Host(主机)端 print,则只是在 Host 打印。如何能让 Host 的 print 直接打印到 Client 上呢?

直接上代码

首先是客户端的:

1
2
3
4
5
6
import sys
import rpyc
conn = rpyc.connect("localhost", port=18861, config={"allow_public_attrs":True})
conn.root.redirect(sys.stdout)
conn.root.git_clone()
conn.close()

服务端的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import rpyc
import os
import sys

import subprocess

class MyService(rpyc.Service):
def exposed_redirect(self, stdout):
sys.stdout = stdout

def exposed_restore(self):
sys.stdout = sys.__stdout__

def exposed_git_clone(self):
p = subprocess.Popen(["git", 'clone', 'git@github.com:ejoy/ejoy2d.git', '--progress'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
nextline = p.stderr.readline()
if nextline == '' and p.poll() != None:
break
print nextline


if __name__ == "__main__":
from rpyc.utils.server import ThreadedServer
t = ThreadedServer(MyService, port = 18861)
t.start()

运行后,你会发现,print nextline 这条命令是打印到客户端上去了。

这里还有一个小地方值得注意的是:

git clone/pull/push 这类操作,事实上是不会向 stdout/stderr 里面写内容的 (除非发送错误)。但是如果加上了 --progress,那么就会把进度往 stderr 里面写。这样,我们的 subprocess 的 stderr 才能被读到。

关于这点,可以看之前我在 stackoverflow 上提的问题: http://stackoverflow.com/questions/25986533/how-to-get-subprocess-stdout-while-running-git-command

作者

薯条

发布于

2014-10-09

更新于

2024-01-15

许可协议

评论