如何捕获另一个模块的打印输出?

13 浏览
0 Comments

如何捕获另一个模块的打印输出?

我在想在Python中是否可能实现这个功能:

# module1
def test():
    print('hey')
# module2
import module1
module1.test() # 打印到stdout

在不修改module1的情况下,是否有办法将其包装在module2中,以便我可以将print('hey')保存在一个变量中?除了将module1作为脚本运行之外?

0
0 Comments

从上述内容中可以看出,问题的原因是想要捕获另一个模块的打印输出。为了解决这个问题,可以使用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__

0
0 Comments

问题的原因是作者不想修改sys.stdout并将其恢复到先前的值。现有的答案没有finally子句,将其集成到其他重要代码中可能会有危险。

解决方法是使用contextlib.redirect_stdout()函数来捕获另一个模块的打印输出。首先,导入contextlib和io库。然后,创建一个io.StringIO()对象f,该对象用于捕获输出。接下来,使用with语句和contextlib.redirect_stdout(f)上下文管理器来临时重定向标准输出。在with语句块中,调用module1.test()函数,该函数会产生一些打印输出。最后,使用f.getvalue()方法获取捕获的输出,并将其保存在变量output中。

注意:这段代码是从官方文档中提取的,稍作修改后(并经过测试)使用。之所以在这里提供答案,是因为我认为这是比其他答案更好的解决方法。

如果想获取捕获的输出,可以使用变量output,它的类型是

0
0 Comments

问题的原因是需要捕获另一个模块的打印输出。解决方法是将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`。

0