在Python的同一过程中捕获标准输出

问题描述

您说您的脚本“调用了一堆函数”,所以我假设它们是可从您的程序访问的python函数。我还假设您正在使用print所有这些函数生成输出在这种情况下,您可以替换sys.stdoutStringIO.StringIO,它将拦截您正在编写的所有内容。然后,您最终可以.getValue在您的方法调用方法StringIO获取已发送到输出通道的所有内容。对于使用写入的子流程模块的外部程序,这也将起作用sys.stdout

这是一种便宜的方法。我建议您使用该logging模块进行输出。您将对其输出的方式有更多的控制,也可以更轻松地对其进行控制。

解决方法

我有一个Python脚本,该脚本调用了许多函数,每个函数都将输出写入stdout。有时,当我运行它时,我想通过电子邮件发送输出(以及生成的文件)。我想知道如何捕获内存中的输出,以便可以使用该email模块构建电子邮件。

到目前为止,我的想法是:

  • 使用内存映射文件(但是似乎我必须为此在磁盘上保留空间,而且我不知道输出将持续多长时间)
  • 绕过所有这些并将输出通过管道传递到sendmail(但是如果我也想附加文件,则可能很难)