Python-撤销stdout重定向

2 投票
3 回答
747 浏览
提问于 2025-04-18 17:28

我知道从这个链接中:

在Python中将输出重定向到“无”

可以让打印语句不显示。但是,之后能不能把这个命令撤销,让打印语句在某个时刻又能显示出来呢?

比如说,我想打印“b”,但不想打印“a”。

我会这样做:

import os
f = open(os.devnull, 'w')
sys.stdout = f

print("a")

# SOME COMMAND

print("b")

有人能告诉我“某个命令”是什么吗?

3 个回答

2

从 Python 3.4 开始,你可以这样做(可以查看 contextlib.redirect_stdout

from contextlib import redirect_stdout

with redirect_stdout(None):
    # stdout suppressed
# stdout restored

with 语句中,stdout 会被抑制,也就是说在这个上下文里,输出不会显示。等你离开 with 的范围后,你的 stdout 就会恢复正常。

顺便提一下:在你原来的版本中,其实不需要 f = open(os.devnull, 'w'),只用 sys.stdout = None 就够了。我最近才了解到这个:为什么 sys.stdout = None 有效?

6

原来的 sys.stdout 总是保存在 sys.__stdout__ 里:

sys.stdout = sys.__stdout__

不过,文档里提到,明确保存原来的 sys.stdout 是更好的做法:

这样做可以在实际文件被一个坏的对象覆盖时,恢复到正常工作的文件对象。不过,更推荐的做法是,在替换之前先明确保存之前的流,然后再恢复保存的对象。

3

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是从一个盒子里拿出东西,然后把它放到另一个盒子里。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者我们想要的数据没有被正确地获取。这就像是你想要的玩具在盒子里,但你找不到它,或者它被放错了地方。

为了避免这些问题,程序员会使用一些工具和方法来确保数据能够顺利地从一个地方转移到另一个地方。这就像是使用一个清单,确保你在搬家时不会忘记任何东西。

总之,处理数据就像是整理和搬运东西,确保一切都在正确的位置,这样我们才能顺利地使用它们。

import os
import sys

f = open(os.devnull, 'w')
x = sys.stdout # save sys.stdout
sys.stdout = f

print("a")


sys.stdout = x # re-assign sys.stdout
print("b") # print 'b'

撰写回答