Python中的标准输出和错误输出由sys模块的stdout、stderr对象负责,所有print语句以及相关的错误信息输出如果要重定向,只需要创建一个类似文件IO的类并将该类的实例替换sys模块的stdout、stderr对象即可。

具体来说,分如下几步完成:

  1. 备份标准输出sys.stdout、stderr对象,以便恢复或做其他处理;

  2. 构建一个支持类似文件io的类

    Python判断对象是否支持文件IO,是个典型的鸭子类型处理方式,就是看对象是否实现了读写方法,由于标准输出无需读只需写,因此只要实现了write方法即可,在对应write方法对捕获输出信息进行处理,如输出到特定文件或图形化窗口

  3. 使用该类似文件io的类创建一个对象,将其赋值给sys.stdout。

案例:

import sys
class myStdout():
def __init__(self):
self.stdoutbak = sys.stdout
self.stderrbak = sys.stderr
sys.stdout = self
sys.stderr = self def write(self,info):
#info信息即标准输出sys.stdout和sys.stderr接收到的输出信息
str = info.rstrip("\r\n")
if len(str):self.processInfo(str) #对输出信息进行处理的方法 def processInfo(self,info):
self.stdoutbak.write("标准输出接收到消息:"+info+"\n") #可以将信息再输出到原有标准输出,在定位问题时比较有用 def restoreStd(self):
print("准备恢复标准输出")
sys.stdout = self.stdoutbak
sys.stderr = self.stderrbak
print("恢复标准输出完成") def __del__(self):
self.restoreStd() print("主程序开始运行,创建标准输出替代对象....")
mystd = myStdout()
print("标准输出替代对象创建完成,准备销毁该替代对象")
#mystd.restoreStd()
del mystd
print("主程序结束")

运行截图:



可以看到,由于上述代码恢复标准输出是从析构方法调用的,由于Python销毁对象的内在处理机制导致析构方法不会在执行del后即执行,且析构方法执行存在不可控因素,导致主程序退出后析构方法未调用,直到执行完成后再次在输出界面按回车键才输出信息,并且这种析构处理过程带有一定的随机性。因此最好显示的调用恢复标准输出的restoreStd方法,且不一定要执行del语句,这样更可控。

下面是调整的主程序代码:

print("主程序开始运行,创建标准输出替代对象....")
mystd = myStdout()
print("标准输出替代对象创建完成,准备销毁该替代对象")
mystd.restoreStd()
#del mystd
print("主程序结束")

执行后结果如下:



从上述过程可以明显看到标准输出重定向捕获成功了。

老猿Python,跟老猿学Python!

在Python实现print标准输出sys.stdout、stderr重定向及捕获的简单办法的更多相关文章

  1. PyQt(Python+Qt)学习随笔:print标准输出sys.stdout以及stderr重定向QTextBrowser等图形界面对象

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 <在Python实现print标准输出sys.stdout.st ...

  2. sys.stdout.write和print和sys.stdout.flush

    1. 先看下官方文档 """ sys.stdout.write(string) Write string to stream. Returns the number of ...

  3. [Python]print vs sys.stdout.write

    之前只是在项目中看到过,没怎么注意,正好跟对象一起看python学习手册,看到了这个部分于是来研究下. python版本 2.7.x os  win7 print  一般就是执行脚本的时候,把信息直接 ...

  4. Python 标准输出 sys.stdout 重定向(转)

    add by zhj: 其实很少使用sys.stdout,之前django的manage.py命令的源码中使用了sys.stdout和sys.stderr,所以专门查了一下 这两个命令与print的区 ...

  5. Python 标准输出 sys.stdout 重定向

    本文环境:Python 2.7 使用 print obj 而非 print(obj) 一些背景 sys.stdout 与 print 当我们在 Python 中打印对象调用 print obj 时候, ...

  6. 关于print()、sys.stdout、sys.stderr的一些理解

    print() 方法的语法: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) 其中file = sys.stdout的 ...

  7. print和sys.stdout

    print print语句执行的操作是一个写操作,把我们从外设输入的数据写到了stdout流,并进行了一些特定的格式化.和文件方法不同,在执行打印操作是,不需要将对象转换为字符串(print已经帮我们 ...

  8. STDOUT/STDERR重定向到ALOG中

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/kangear/article/details/24534707      说下背景:如今众多Andr ...

  9. Linux Shell 文件描述符 及 stdin stdout stderr 重定向

    Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...

随机推荐

  1. c#分割习题

    2.从一个记录了学生成绩的文本文档,每个学生成绩是一行,每行是用 | 分割的数据,用 | 分割的域分别是姓名.年龄.成绩.年级,写程序取出各个年级成绩最高学生的成绩.年级放到集合中.提示:(1)使用 ...

  2. Android测试三件套:传文件、抓包、看日志

    在对安卓进行测试时,我们需要把 apk 传到安卓机上,对请求抓包,同时监控应用日志.本文就来讲讲具体操作. 安卓机是指基于安卓的机器 ,如手机.POS 机.电视盒子等. 传文件 我们拒绝用 U 盘传文 ...

  3. C语言I博客作业3

    这个作业属于哪个课程 <https://edu.cnblogs.com/campus/zswxy/SE2020-1 > 这个作业要求在哪里 https://edu.cnblogs.com/ ...

  4. Firefox威武 尚译威武!

    有感于鹰文文档看起来麻烦,期待有一款即时翻译的工具,在windows上还可以,但是上班用的是ubuntu,所以就想到要找一个firefox插件,还真找到了,但是不是插件,是一个书签,那就是尚译!尚哥威 ...

  5. 《.NET 5.0 背锅案》第5集-案情大转弯:都是我们的错,让 .NET 5.0 背锅

    第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...

  6. 【javascript】掌握ES6-10,附xmind思维导图,每个知识点备注说明案例,请享用

    前段时间一直想掌握ES6-10,陆陆续续花了1个月的时间,自学了ES6-10的新知识点,大部分都是非常实用的,花了2天时间整理思维导图 思维导图已上传博客园,请享用. ES6-10思维导图xmind ...

  7. 测试_QTP使用

    1.Qtp是什么? QTP是Quick Test Professional的简称,是一种自动测试工具.使用QTP的目的是想用它来执行重复的自动化测试,主要是用于回归测试和测试同一软件的新版本.(百度百 ...

  8. Cpython的全局解释器锁(GIL)

    # Cpyrhon解释器下有个全局解释器锁-GIL:在同一 # 在同一时刻,多线程中只有一个线程访问CPU # 有了全局解释器锁(GIL)后,在同一时刻只能有一个线程访问CPU. # 全局解释器锁锁的 ...

  9. HDU100题简要题解(2080~2089)

    //2089之前忘做了,周二C语言课上做,至于2086,写题解的时候突然发现之前的做法是错的,新的解法交上去CE,等周二再弄吧,其余题目暂时可以放心 HDU2080 夹角有多大II 题目链接 Prob ...

  10. 5G时代,URL Rewrite 还吃香吗

    URL Rewrite是网站建设中经常用到的一项技巧,通过 rewrite 我们能够屏蔽服务器运行态的信息,包括服务的程序.参数等等,给用户呈现美化后的URL,同时对搜索引擎更加友好,方便我们网站的推 ...