【问题标题】:Is there a way to read stdout in python?有没有办法在 python 中读取标准输出?
【发布时间】:2020-09-13 20:58:17
【问题描述】:

我想要的是将我在标准输出中写入的所有文本作为字符串获取。

from sys import stdout

stdout.read()  # throws io.UnsupportedOperation: not readable

我想得到的例子:

print("abc")
stdout.read() == "abc"  # True

【问题讨论】:

    标签: python io stdout


    【解决方案1】:

    没有。正如文档所说,stdout 不可读。将其视为将信息发送到物理打印机。例如,当您将一页文本发送到您的传真打印机扫描仪设备时,您的程序将如何读取该输出?字符被发送到一个输出缓冲区,下到物理设备,然后刷新到纸上。

    处理此问题的规范方法是使用日志记录,它在大多数成熟语言(包括 Python)中都有多个支持包。您创建一个记录器,其log 方法(写入输出)将其输入回显到print 和您创建的另一个存储。您添加一个read 方法以允许您访问该商店。

    这让您可以进行一些研究和一些编码工作,但我相信您可以从这里开始。在线查找logger 教程。当然,如果您对这种编码感到困惑,您可以在 Stack Overflow 上发布您的示例。 :-)

    【讨论】:

      【解决方案2】:

      如果您使用的是 3.4 或更高版本,可以在 contextlib 的文档中找到此配方

      f = io.StringIO()
      with contextlib.redirect_stdout(f):
         ... stuff ...
      
      result = f.getvalue()
      

      请注意,对标准输出的影响是全局的,因此不要在库或线程应用程序中使用它。

      【讨论】:

        【解决方案3】:

        如果你不想使用logger,你可以创建一个自定义打印函数:

        from io import StringIO
        
        printstore = StringIO()
        
        def myprint(*args, **kwargs):
            print(*args, **kwargs) # unmodified print
            kwargs["file"] = printstore
            print(*args, **kwargs) # print to StringIO
        

        这样做的好处是您可以获得内置 print 的所有灵活性。
        一个缺点是它只捕获使用myprint 打印的输出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-20
          相关资源
          最近更新 更多