如何捕获另一个模块的打印输出?
从上述内容中可以看出,问题的原因是想要捕获另一个模块的打印输出。为了解决这个问题,可以使用sys.stdout
来控制标准输出,并将其重定向到一个文件。具体的解决方法如下:
import sys stdout_ = sys.stdout # 保存之前的stdout值 sys.stdout = open('myoutputfile.txt', 'w') # 用一个提供write方法的对象替代stdout # 调用print语句,比如import module1 sys.stdout = stdout_ # 恢复之前的stdout值
如果想要恢复默认的stdout,可以将最后一行代码替换为sys.stdout = sys.__stdout__
。
问题的原因是作者不想修改sys.stdout并将其恢复到先前的值。现有的答案没有finally子句,将其集成到其他重要代码中可能会有危险。
解决方法是使用contextlib.redirect_stdout()函数来捕获另一个模块的打印输出。首先,导入contextlib和io库。然后,创建一个io.StringIO()对象f,该对象用于捕获输出。接下来,使用with语句和contextlib.redirect_stdout(f)上下文管理器来临时重定向标准输出。在with语句块中,调用module1.test()函数,该函数会产生一些打印输出。最后,使用f.getvalue()方法获取捕获的输出,并将其保存在变量output中。
注意:这段代码是从官方文档中提取的,稍作修改后(并经过测试)使用。之所以在这里提供答案,是因为我认为这是比其他答案更好的解决方法。
如果想获取捕获的输出,可以使用变量output,它的类型是
问题的原因是需要捕获另一个模块的打印输出。解决方法是将stdout重定向到一个符合stdout接口的内存缓冲区,可以使用StringIO来实现。以下是一个在Python 2.7中工作的示例代码:
import sys import cStringIO # 保存先前的stdout值 stdout_ = sys.stdout stream = cStringIO.StringIO() # 将stdout重定向到stream sys.stdout = stream # 在这里可以做任何你想做的事情,比如导入module1,调用test print("hello") # 恢复先前的stdout sys.stdout = stdout_ # 获取stream中的打印输出 variable = stream.getvalue() # 这将把"hello"字符串赋值给变量
这样做之后,`sys.stdout.encoding`会有所不同(在stdout被更改之后),`stdout`提供的功能不仅仅是`write`。