如何重定向 python 中函数的打印输出[重复]

2024-04-16

可能的重复:
我可以将 python 中的标准输出重定向到某种字符串缓冲区吗? https://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer

我在 python 中有一个函数可以将一些内容打印到标准输出

def foo():
    print("some text")

我想将此函数中打印的文本“重定向”到变量中,即“包装”此函数或其他任何内容,以便将文本存储在变量中:

text = wrapper(foo)

有没有一种强大的方法可以暂时改变sys.stdout或打开一个变量作为FileObject, 或者是其他东西?


对于 python3.4+,标准库中有一个上下文管理器。

with contextlib.redirect_stdout(file_like_object):
    ...

这部分答案已更新,但主要是针对那些仍然停留在 python2.x 世界的人

如果您坚持使用旧版本的 python,那么您自己编写这个上下文管理器并不难。关键是可以更新sys.stdout到任何你想要的类似文件的对象(这就是print写信给):

>>> import sys
>>> import StringIO
>>> stdout = sys.stdout  # keep a handle on the real standard output
>>> sys.stdout = StringIO.StringIO() # Choose a file-like object to write to
>>> foo() 
>>> sys.stdout = stdout
>>> foo()
bar

创建一个上下文管理器 http://docs.python.org/2/reference/datamodel.html#context-managers当您进入上下文时将标准输出设置为您想要的任何内容,然后让上下文管理器在您输入时重置标准输出__exit__上下文。

这是一个简单的例子,使用contextlib创建上下文管理器:

import contextlib
import sys

@contextlib.contextmanager
def stdout_redirect(where):
    sys.stdout = where
    try:
        yield where
    finally:
        sys.stdout = sys.__stdout__

def foo():
    print 'bar'

# Examples with StringIO
import StringIO

with stdout_redirect(StringIO.StringIO()) as new_stdout:
    foo()

new_stdout.seek(0)
print "data from new_stdout:",new_stdout.read()

new_stdout1 = StringIO.StringIO()
with stdout_redirect(new_stdout1):
    foo()

new_stdout1.seek(0)
print "data from new_stdout1:",new_stdout1.read()

# Now with a file object:
with open('new_stdout') as f:
    with stdout_redirect(f):
        foo()

# Just to prove that we actually did put stdout back as we were supposed to
print "Now calling foo without context"
foo()

Note:

在 python3.x 上,StringIO.StringIO已移至io.StringIO。另外,在 python2.x 上,cStringIO.StringIO性能可能会稍微好一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重定向 python 中函数的打印输出[重复] 的相关文章

随机推荐

  • PHP如何在弹出模式中获取用户ID(变量)

    许多员工及其信息显示在页面上 员工信息通过数据库检索 然后通过foreach 循环用于显示符合搜索条件的所有员工 示例如下图所示 现在 当用户单击按钮时 会触发一个简单的 Bootstrap 弹出模式 其中包含一些基本表单字段 从下面的示例
  • 如果过去 60 分钟的交易量小于 x,如何在 Seyren with Graphite 中发出警报?

    我正在使用 Graphite Statsd 带有 Python 客户端 从 Web 应用程序收集自定义指标 成功交易的计数器 假设计数器是stats transactions count 还有一个每秒速率指标stats transactio
  • 链接器输入文件未使用的 c++ g++ make 文件

    我无法弄清楚是什么导致了我在制作项目时不断遇到的错误 i686 apple darwin11 llvm g 4 2 lncurses linker input file unused because linking not done 我的
  • 自执行功能不起作用?

    我有代码 function i alert i 3 我不明白为什么我看不到警报 这个语法是什么意思 以及为什么这段代码 function i alert i 3 有效吗 有什么不同 我缺少什么 第一个片段将被解释为函数声明 它需要一个名称
  • gitlab-ci.yml&docker-in-docker(dind)&curl 在共享运行器上返回连接被拒绝

    我正在尝试创建一个简单的 GitLab CI 在其中使用 docker compose up 启动一个容器 然后尝试使用curl 访问它 最后使用 docker compose down 将其拆除 docker compose up 旋转得
  • 使用小数分隔符和千位分隔符验证小数

    您好 我使用这个正则表达式来验证带有小数分隔符和千位分隔符的数字 ets eds 0 9 ets eds 0 9 但是这个fail 它不应该接受 对于我的两个单元测试用例 12 and 1 2 有人可以帮忙吗 注意 这项工作适用于1 2 让
  • 如何使用node.js驱动程序复制mongodb集合?

    有没有办法通过 Node js mongodb 驱动程序复制集合 i e collection copyTo duplicate collection 您可以评估copyTo 服务器端虽然它会阻止整个 mongod 进程并且不会在新集合上创
  • 中小型 .NET 应用程序的数据库(和 ORM)选择

    我需要开发一个基于 NET 的应用程序 其数据需求可能超过 SQL 2005 Express Edition 的 4 gig 限制 由于内部 DBA 的专业知识 同一应用程序的其他客户 将来 可能需要使用特定的数据库平台 例如 Oracle
  • 在 Rails 表单错误消息中显示链接

    在我们的注册表单上 我们validates uniqueness of email 当用户尝试使用我们的注册表单并指定现有的电子邮件地址时 我希望他们看到这样的错误消息 该邮件地址已被使用 如果您在登录时遇到问题 您可以重置你的密码 htt
  • 如何计算闰年?

    我对闰年有一些疑问 如何通过使用这样的公式来确定 add years function x y if isTRUE all equal y round y stop Argument y must be an integer n x lt
  • UIImageview 以快速编程方式

    我只是想创建一个UIImage以编程方式查看 我有一个新视图 我尝试这样做 let imageName yourImage png view backgroundColor UIColor colorWithPatternImage UII
  • 如何使用maven pom.xml创建jar

    我需要一个示例 pom 文件来为我的 spring 项目创建 jar 文件 创建jar文件时如何指定创建资源的目录和文件夹 我可以使用 pom jar 文件创建 jar 文件 但我需要将 applicationContext xml 包含在
  • 在 PHP 中使用 pthreads 创建异步超时

    我正在尝试在 PHP 中创建某种异步超时 我使用 PECL 扩展 pthreads 来实现多线程 异步超时工作正常 但参考却不然 我使用 PHP 5 5 8 进行此测试 class ParentClass public test publi
  • tensorflow conv2d偶数步长和奇数步长之间的不同起始索引

    据我了解从tf nn conv2d 文档 https www tensorflow org api docs python tf nn conv2d对于相同的卷积 无论步幅如何 第一个点积应以 0 0 为中心 正如您在下面看到的 当步幅为奇
  • 如何从 boost::shared_ptr 释放指针?

    boost shared ptr 可以释放存储的指针而不删除它吗 我可以看到文档中不存在释放函数 并且在常见问题解答中也解释了为什么它不提供释放函数 例如不能在不唯一的指针上完成释放 我的指点是独一无二的 我怎样才能释放我的指针 或者使用哪
  • 我应该为 SCJP 准备多长时间? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 好吧 我知道这可能听起来有点傻 因为这取决于个人 但平均来说我应该花多少时间来准备 SCJP 我已经有一些 Java 经验 我的大学的一些中小型项目
  • 导入XML - JavaScript?导入的内容为空[重复]

    这个问题在这里已经有答案了 我正在尝试导入一个字段 该字段有助于指示餐厅当前是否接受在线订单 INDEX IMPORTXML https www doordash com store yolk test kitchen chicago 39
  • 保存并加载 keras 自动编码器

    看看这个奇怪的加载 保存模型情况 我保存了变分自动编码器模型及其编码器和解码器 autoencoder save autoencoder save overwrite True encoder save encoder save overw
  • 想要下载Git仓库,我需要什么(windows机器)?

    我想下载这个开源应用程序 他们正在使用 Git 下载代码库需要什么 Update使用 Git Bash 时如何更改工作目录 我想将存储库下载到某个目录 使用 pwd 告诉我我将在不需要的地方下载存储库 下载Msys 上的 Git http
  • 如何重定向 python 中函数的打印输出[重复]

    这个问题在这里已经有答案了 可能的重复 我可以将 python 中的标准输出重定向到某种字符串缓冲区吗 https stackoverflow com questions 1218933 can i redirect the stdout