zoukankan      html  css  js  c++  java
  • 在Python实现print标准输出sys.stdout、stderr重定向及捕获的简单办法

    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("
    ")
           if len(str):self.processInfo(str)  #对输出信息进行处理的方法
        
        def processInfo(self,info):
            self.stdoutbak.write("标准输出接收到消息:"+info+"
    ") #可以将信息再输出到原有标准输出,在定位问题时比较有用
    	
        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!

  • 相关阅读:
    markdownPad2 绿色破解版安装
    解决idea 控制台中文乱码
    PS CC 破解安装教程(亲测可用)
    mp4文件格式之fragment mp4
    音视频技术总结
    ffmpeg的内部Video Buffer管理和传送机制
    OMX Codec详细解析
    Gstreamer的一些基本概念与A/V同步分析
    stagefright omx小结
    OMXCodec与OMX事件处理流程
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/12634938.html
Copyright © 2011-2022 走看看