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!

最新文章

  1. Linux时间戳和标准时间的互转
  2. css 水平居中垂直居中的几种方法
  3. MVC @functions
  4. Yii2下拉框实现
  5. xml直接读取节点
  6. ASP.NET Core和ASP.NET Framework共享Identity身份验证
  7. 讯飞语音SDK Android平台使用
  8. 【HDOJ】2289 Cup
  9. HDU 1495 非常可乐 BFS 搜索
  10. phonegap学习入门
  11. C# 将对象序列化为Json格式
  12. html学习 - 自己主动跳转与自己主动刷新
  13. 100个精选zencart扩展插件
  14. Jasperreports以及iReport4.5报表PDF导出字体完美解决方案
  15. 201621123062《java程序设计》第八周作业总结
  16. Iterate over slices of a string
  17. line-height:150%与line-height:1.5的区别
  18. Latex(数学)
  19. codeforces263B
  20. [Kubernetes]CentOS7下搭建Harbor仓库

热门文章

  1. PS中抠图的四种方法介绍
  2. vi&vim 基本使用方法
  3. 对pipe downstream的思考&分析
  4. 全文思维导图------redis设计与实现
  5. mysql学习——数据库基本操作
  6. Mate 40系列发布 搭载华为运动健康服务带来健康数字生活
  7. IMX8移植cpufreq子系统
  8. FL Studio20效果器Fruity Reverb 2功能介绍
  9. Guitar Pro吉他指弹入门——特殊调弦
  10. kafka对接Rancher日志