Python-Undoing stdout重定向

时间:2014-08-16 01:09:02

标签: python

所以我知道

Redirecting stdout to "nothing" in python

您可以取消打印报表。但是以后可以撤消该命令,以便在某些点之后,确实会再次打印出打印语句吗?

例如,我们想要打印" b"但不是" a"。

我愿意:

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

print("a")

# SOME COMMAND

print("b")

有人可以告诉我什么" SOM COMMAND"会是吗?

3 个答案:

答案 0 :(得分:3)

原始sys.stdout始终保留在sys.__stdout__中:

sys.stdout = sys.__stdout__

但是,文档确实注意到显式保存原始sys.stdout是首选:

  

它还可用于将实际文件还原到已知工作文件   对象,以防它们被破坏的对象覆盖。   但是,执行此操作的首选方法是明确保存   替换之前的上一个流,并恢复保存的对象。

答案 1 :(得分:2)

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'

答案 2 :(得分:1)

从python 3.4开始,你可以这样做(见contextlib.redirect_stdout

public class MyClass {

  private OtherClass otherClassInstance; // setter/constructor/autowire/whatever     

  public Response someMethod() {

    Response response = Wrapper.wrap( () -> {
      return otherClassInstance.doSomething(); // now that's testable
    });

    // .... do something else ....

    return Response;
  }

}

from contextlib import redirect_stdout with redirect_stdout(None): # stdout suppressed # stdout restored 在with语句中被禁止。在stdout上下文之外,您的with已恢复。

顺便说一下:原始版本中不需要stdout - f = open(os.devnull, 'w')就像我最近学到的那样:why does sys.stdout = None work?