3

在 Java 中,我可以使用

ByteArrayOutputStream stdout = new ByteArrayOutputStream();
System.setOut(new PrintStream(stdout));
String toUse = stdout.toString();

/**
 * do all my fancy stuff with string `toUse` here
 */

//Now that I am done, set it back to the console
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));

有人可以告诉我在python中这样做的等效方法吗?我知道这个问题的不同风格已经被问过很多次,例如Python: Closing a for loop by reading stdoutHow to get stdout into a string (Python)。但我有一种感觉,我不需要导入子流程来获得我需要的东西,因为我需要的比这更简单。我在eclipse上使用pydev,我的程序很简单。

我已经试过了

from sys import stdout

def findHello():
  print "hello world"
  myString = stdout

  y = 9 if "ell" in myString else 13

但这似乎不起作用。我得到一些关于打开文件的compaints。

4

1 回答 1

3

如果我已经理解您尝试正确执行的操作,那么这样的事情将使用一个StringIO对象来捕获您写入的任何内容stdout,这将允许您获取值:

from StringIO import StringIO
import sys

stringio = StringIO()
previous_stdout = sys.stdout
sys.stdout = stringio

# do stuff

sys.stdout = previous_stdout

myString = stringio.getvalue()

当然,这会抑制实际到原始的输出stdout。如果要将输出打印到控制台,但仍要捕获该值,则可以使用以下内容:

class TeeOut(object):
    def __init__(self, *writers):
        self.writers = writers

    def write(self, s):
        for writer in self.writers:
            writer.write(s)

并像这样使用它:

from StringIO import StringIO
import sys

stringio = StringIO()
previous_stdout = sys.stdout
sys.stdout = TeeOut(stringio, previous_stdout)

# do stuff

sys.stdout = previous_stdout

myString = stringio.getvalue()
于 2013-01-31T17:19:09.777 回答