有没有办法在python中读取stdout?

问题描述

我想要的是获取我在stdout中编写的所有文本作为字符串。

rsync -bauvn --compare-dest /externalharddrive /desktopfolder/ /thirddestination

我想要得到的例子:

from sys import stdout

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

解决方法

不。如文档所述,stdout不可读。可以将其视为向物理打印机发送信息。例如,当您将文本页面发送到FAX-打印机-扫描仪设备时,程序将如何读取该输出?字符被发送到输出缓冲区,再到物理设备,然后刷新到纸张上。

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

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

,

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

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

result = f.getvalue()

请注意,对stdout的影响是全局的,因此请勿在库或线程应用程序中使用它。

,

如果您不想使用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打印的输出。