我有一个调用一堆函数的python脚本,每个函数都将输出写入stdout.有时当我运行它时,我想通过电子邮件发送输出(以及生成的文件).我想知道如何捕获内存中的输出,以便我可以使用该email
模块来构建电子邮件.
到目前为止我的想法是:
Gar*_*son 13
我修改了None的答案,使其成为一个上下文管理器:
import sys, StringIO, contextlib
class Data(object):
pass
@contextlib.contextmanager
def capture_stdout():
old = sys.stdout
capturer = StringIO.StringIO()
sys.stdout = capturer
data = Data()
yield data
sys.stdout = old
data.result = capturer.getvalue()
Run Code Online (Sandbox Code Playgroud)
用法:
with capture_stdout() as capture:
print 'Hello'
print 'Goodbye'
assert capture.result == 'Hello\nGoodbye\n'
Run Code Online (Sandbox Code Playgroud)
捕获输出非常简单.
import sys, StringIO
old_stdout = sys.stdout
capturer = StringIO.StringIO()
sys.stdout = capturer
#call functions
print "Hi"
#end functions
sys.stdout = old_stdout
output = capturer.getvalue()
Run Code Online (Sandbox Code Playgroud)
你说你的脚本“调用了一堆函数”,所以我假设它们是可以从你的程序访问的Python函数。我还假设您正在使用print
所有这些函数来生成输出。如果是这种情况,您只需替换sys.stdout
为 aStringIO.StringIO
即可拦截您正在编写的所有内容。然后您最终可以调用.getValue
您的方法StringIO
来获取已发送到输出通道的所有内容。这也适用于使用写入 .subprocess 模块的外部程序sys.stdout
。
这是一种廉价的方法。我建议您使用该logging
模块进行输出。您将可以更好地控制它的输出方式,并且也可以更轻松地控制它。