为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法在Python中读取stdout?

有没有办法在Python中读取stdout?

慕莱坞森 2023-08-03 17:16:50
我想要的是将我在标准输出中写入的所有文本作为字符串获取。from sys import stdout stdout.read()  # throws io.UnsupportedOperation: not readable我想要得到的示例:print("abc") stdout.read() == "abc"  # True
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

不,正如文档所说,stdout不可读。将其视为将信息发送到物理打印机。例如,当您将一页文本发送到传真打印机扫描仪设备时,您的程序如何读取该输出?字符被发送到输出缓冲区,向下发送到物理设备,然后刷新到纸张上。

处理这个问题的规范方法是使用日志记录,它在大多数成熟语言(包括 Python)中都有多个支持包。您创建一个记录器,其log方法(写入输出)将其输入回显到print您创建的另一个存储中。您添加一个read方法来允许您访问该商店。

这让您需要做一些研究和一些编码工作,但我相信您可以从这里开始。logger网上找一下教程。当然,如果您对这种编码感到困惑,您可以在 Stack Overflow 上发布您的示例。:-)


查看完整回答
反对 回复 2023-08-03
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

如果您使用的是 3.4 或更高版本,可以在 contextlib 文档中找到此方法


f = io.StringIO()

with contextlib.redirect_stdout(f):

   ... stuff ...


result = f.getvalue()

请注意,对 stdout 的影响是全局的,因此不要在库或线程应用程序中使用它。


查看完整回答
反对 回复 2023-08-03
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

如果您不想使用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。


查看完整回答
反对 回复 2023-08-03
  • 3 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信