我可以将stdout重定向到某种字符串缓冲区吗?

190 投票
9 回答
186470 浏览
提问于 2025-04-15 13:20

我正在用Python的ftplib写一个小的FTP客户端,但这个包里的某些函数不会返回字符串输出,而是直接打印到stdout。我想把stdout重定向到一个我可以读取输出的对象。

我知道stdout可以通过以下方式重定向到任何普通文件:

stdout = open("file", "a")

但我更希望有一种方法,不需要使用本地硬盘。

我在寻找类似Java中BufferedReader的东西,可以把一个缓冲区包装成一个流。

9 个回答

42

补充一下Ned上面的回答:你可以用这个方法把输出重定向到任何实现了write(str)方法的对象

这可以很好地用来在图形用户界面(GUI)应用程序中“捕捉”标准输出(stdout)的内容。

下面是一个在PyQt中的简单例子:

import sys
from PyQt4 import QtGui

class OutputWindow(QtGui.QPlainTextEdit):
    def write(self, txt):
        self.appendPlainText(str(txt))

app = QtGui.QApplication(sys.argv)
out = OutputWindow()
sys.stdout=out
out.show()
print "hello world !"
155

在Python 3.4及以上版本中,有一个叫做 contextlib.redirect_stdout() 的函数

import io
from contextlib import redirect_stdout

with io.StringIO() as buf, redirect_stdout(buf):
    print('redirected')
    output = buf.getvalue()

这里有一个 代码示例,展示了如何在旧版本的Python中实现这个功能

258

在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,可能会有一些错误信息或者代码运行不正常。这时候,我们可以去像StackOverflow这样的网站上寻求帮助。在这些网站上,很多人会分享他们遇到的问题和解决方案。

当你在这些网站上提问时,记得把你的问题描述得清楚明了,这样别人才能更好地理解你的情况并给出建议。同时,提供一些相关的代码片段也很重要,这样别人可以更快地找到问题所在。

总之,利用好这些资源,可以帮助你更快地解决编程中的难题。

from cStringIO import StringIO # Python3 use: from io import StringIO
import sys

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()

# blah blah lots of code ...

sys.stdout = old_stdout

# examine mystdout.getvalue()

撰写回答