将Python的标准输出作为字符串读取

3
在Java中,我可以使用以下方式将stdout读取为字符串:
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)。但是我感觉我不需要导入subprocess来得到我想要的结果,因为我的需求比那更简单。我正在使用eclipse上的pydev,并且我的程序非常简单。
我已经尝试过
from sys import stdout

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

  y = 9 if "ell" in myString else 13

但是似乎这并没有起作用。我收到了一些关于打开文件的投诉。

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接