【问题标题】:What would cause the inner contents of a `with` statement to not execute?什么会导致 `with` 语句的内部内容不执行?
【发布时间】:2023-01-13 05:25:21
【问题描述】:

当我运行以下代码时,没有打印任何错误消息,而且它似乎无声地失败了。我希望将字符串 "BLAH" 打印到控制台。

from contextlib import redirect_stdout
import io # the initialism `io` represents `INPUT OUTPUT LIBRARY`

def run_solver():
    print("solver is running")

with io.StringIO() as fake_std_out:
    with redirect_stdout(fake_std_out):
        print("BLAH") # THIS IS NEVER PRINTED
        run_solver()
        data = fake_std_out.getvalue()
        print(data)
print("THE END")

我期望的输出是:

BLAH
solver is running
THE END

相反,我们有:

THE END

编辑

  1. 我现在意识到我想复制标准输出,而不是重定向它。
  2. 使用print 打印字符串流的内容将不起作用,因为打印函数的目标现在是字符串流而不是系统控制台。在调用 getvalue() 之后,再尝试使用 print 语句是没有意义的。

【问题讨论】:

  • 它完全按照你的要求去做。 stdout 被重定向到 fake_std_out。你认为 redirect_stdout 会做什么?
  • print 写入标准输出(无论是什么),而不是直接写入控制台。
  • 您的问题实际上是在问“当标准输出被重定向到其他地方时,我如何打印到真正的标准输出?”答案是,print("BLAH", file=sys.__stdout__)

标签: python python-3.x with-statement silent


【解决方案1】:

代码工作正常。 print 写入标准输出,而不是直接写入控制台。您可以按照内部with 语句自行检查写入fake_std_out 的值。

from contextlib import redirect_stdout
import io

def run_solver():
    print("solver is running")

with io.StringIO() as fake_std_out:
    with redirect_stdout(fake_std_out):
        print("BLAH")
        run_solver()

    assert fake_std_out.getvalue() == 'BLAH
solver is running
'

print("THE END")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2015-08-24
    • 2020-02-22
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多