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