【发布时间】:2020-09-13 20:58:17
【问题描述】:
我想要的是将我在标准输出中写入的所有文本作为字符串获取。
from sys import stdout
stdout.read() # throws io.UnsupportedOperation: not readable
我想得到的例子:
print("abc")
stdout.read() == "abc" # True
【问题讨论】:
我想要的是将我在标准输出中写入的所有文本作为字符串获取。
from sys import stdout
stdout.read() # throws io.UnsupportedOperation: not readable
我想得到的例子:
print("abc")
stdout.read() == "abc" # True
【问题讨论】:
没有。正如文档所说,stdout 不可读。将其视为将信息发送到物理打印机。例如,当您将一页文本发送到您的传真打印机扫描仪设备时,您的程序将如何读取该输出?字符被发送到一个输出缓冲区,下到物理设备,然后刷新到纸上。
处理此问题的规范方法是使用日志记录,它在大多数成熟语言(包括 Python)中都有多个支持包。您创建一个记录器,其log 方法(写入输出)将其输入回显到print 和您创建的另一个存储。您添加一个read 方法以允许您访问该商店。
这让您可以进行一些研究和一些编码工作,但我相信您可以从这里开始。在线查找logger 教程。当然,如果您对这种编码感到困惑,您可以在 Stack Overflow 上发布您的示例。 :-)
【讨论】:
如果您使用的是 3.4 或更高版本,可以在 contextlib 的文档中找到此配方
f = io.StringIO()
with contextlib.redirect_stdout(f):
... stuff ...
result = f.getvalue()
请注意,对标准输出的影响是全局的,因此不要在库或线程应用程序中使用它。
【讨论】:
如果你不想使用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 打印的输出。
【讨论】: