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

Remote Python Call (RPyC) 是一个 Python 的库用来实现 RPC 和分布式计算的工具。支持同步和异步操作、回调和远程服务以及透明的对象代理

功能

透明 -访问远程对象,如果它们是本地现有的代码可以无缝地与本地或远程对象。
对称 -协议本身是完全对称的,这意味着可以为客户端和服务器请求。除其他外,这使得服务器调用客户端回调。
同步和异步操作
平台无关 - 32/64位,小/大端的Windows / Linux / Solaris / Mac上的... 访问对象在不同的架构。
低开销 - RpyC需要的所有功能于一身的做法,采用紧凑的二进制协议,无需复杂的设置(域名服务器的HTTP URL映射等)
安全 -采用了能力为基础 的安全模型
集成的TLS / SSL, SSH的和inetd的。

###本文所解决问题:

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

###直接上代码

首先是客户端的:

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()

服务端的:

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才能被读到。

时间: 2024-08-02 12:38:26

python中使用RPyC时重定向命令行输出的相关文章

使用Python编写类UNIX系统的命令行工具的教程_python

引言 您是否能编写命令行工具?也许您可以,但您能编写出真正好用的命令行工具吗?本文讨论使用 Python 来创建一个强健的命令行工具,并带有内置的帮助菜单.错误处理和选项处理.由于一些奇怪的原因,很多人并不了解 Python? 的标准库具有制作功能极其强大的 *NIX 命令行工具所需的全部工具. 可以这样说,Python 是制作 *NIX 命令行工具的最佳语言,因为它依照"batteries-included"的哲学方式工作,并且强调提供可读性高的代码.但仅作为提醒,当您发现使用 Py

python-问下Python 中删除TXT文件的指定行

问题描述 问下Python 中删除TXT文件的指定行 问下Python 中读取TXT文件的每一行,匹配有例如:rating的行就删除该行或者将rating替换为avg也可以,怎么写啊? (该文本中的每行都有空格,开头也可能有空格),谢谢啦,嘿嘿 解决方案 删除txt文件内容的指定行获取指定目录下所有的.txt文件python 读写txt文件 json文件 解决方案二: line=f.readlines() del line[1] //你想删除的行, 如果想匹配就迭代吧

C#用Process类调用cmd时,命令行那里首字母乱码

问题描述 C#用Process类调用cmd时,命令行那里首字母乱码 //获取环境变量 string processName = Environment.GetEnvironmentVariable("ComSpec"); Process myprocess = new Process(); try { myprocess.StartInfo.UseShellExecute = false; myprocess.StartInfo.FileName = processName; mypr

四个Python库,实现超实用的命令行功能

在二部曲系列文章的第二部分关于伟大的命令行 UI 终端应用文章中,我们探索了"提示工具包","命令行界面创建工具包","Pygments"和"模糊搜索". 这是我的二部曲终端应用程序与伟大的命令行界面的第二部分. 在第一篇文章中,我介绍了几个能使使用命令行程序充满乐趣的功能. 在第二部分中,我将介绍如何在几个 Python 库的帮助下实现这些功能. 在本文结尾,读者应该很好地了解如何使用 Prompt Toolkit,Clic

Linux中10个有用的命令行补全例子_linux shell

在 Linux 系统中,当你输入一个命令,再按两次TAB 键,就会列出所有以你输入字符开头的可用命令.这并不新鲜,可能你已经知道了.这个功能被称作命令行补全bash completion.默认情况下,bash 命令行可以自动补全文件或目录名称.不过,我们可以增强 bash 命令补全功能,通过 complete 命令让它达到新的高度.  这个教程说明了我们是怎样使用可编程的命令行补全功能(programmable completion)把自动补全功能应用于选项或者命令行参数.  例如:在输入 wr

Java中使用设计模式来优化命令行交互程序的开发

人机交互的方式最初起始于命令行交互,虽然图形界面的交互方式应用越来越广泛,可是命令行交互仍然有着它不可替代的地位.命令行交互程序是以命令行方式进行的http://www.aliyun.com/zixun/aggregation/11432.html">人机交互,即用户按着程序的提示,一步步进行输入,而程序负责解释并最终执行指令. 本文以一个简单的部署 war 包的实例,说明在命令行交互程序设计中遇到的问题,以及如何使用设计模式来解决这些问题. 实例简介 在实例中,命令行交互程序给出了一组问

Linux系统中下载文件的wget命令行工具

简介 Linux系统中的wget是一个下载文件的命令行工具. 对于Linux用户是必不可少的工具,对于经常要下载一些软件或从远程服务器恢复备份到本地服务器,这个命令尤为重要.wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. 自动下载 wget支持自动下载,即wget可以在用户退出系统的之后在后台执行.这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,这是个牛气冲天的功能. 完全重建 wget 可以跟踪HTML页面上的链接依次下载

Linux 中 10 个有用的命令行补全例子

在 Linux 系统中,当你输入一个命令,再按两次 TAB 键,就会列出所有以你输入字符开头的可用命令.这并不新鲜,可能你已经知道了.这个功能被称作命令行补全bash completion.默认情况下,bash 命令行可以自动补全文件或目录名称.不过,我们可以增强 bash 命令补全功能,通过 complete 命令让它达到新的高度. 这个教程说明了我们是怎样使用可编程的命令行补全功能programmable completion把自动补全功能应用于选项或者命令行参数. 例如:在输入 write

3.QT中QCommandLineParser和QCommandLineOption解析命令行参数

 1  新建项目 main.cpp #include <QCoreApplication> #include <QCommandLineParser> #include <QDebug> #include <stdio.h>   int main(int argc, char** argv) {     QCoreApplication app(argc, argv);       app.setApplicationVersion("1.0.