我可以将stdout重定向到某种字符串缓冲区吗?
我正在用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()