从脚本捕获标准输出?

假设有一个脚本执行以下操作:


# module writer.py

import sys


def write():

    sys.stdout.write("foobar")

现在,假设我要捕获write函数的输出并将其存储在变量中以进行进一步处理。天真的解决方案是:


# module mymodule.py

from writer import write


out = write()

print out.upper()

但这是行不通的。我想出了另一个解决方案,它可以工作,但是请告诉我是否有解决问题的更好方法。谢谢


import sys

from cStringIO import StringIO


# setup the environment

backup = sys.stdout


# ####

sys.stdout = StringIO()     # capture output

write()

out = sys.stdout.getvalue() # release output

# ####


sys.stdout.close()  # close the stream 

sys.stdout = backup # restore original stdout


print out.upper()   # post processing


阿波罗的战车
浏览 442回答 3
3回答

holdtom

设置stdout是一种合理的方法。另一个是将其作为另一个进程来运行:import subprocessproc = subprocess.Popen(["python", "-c", "import writer; writer.write()"], stdout=subprocess.PIPE)out = proc.communicate()[0]print out.upper()

人到中年有点甜

这是代码的上下文管理器版本。它产生两个值的列表。第一个是stdout,第二个是stderr。import contextlib@contextlib.contextmanagerdef capture():    import sys    from cStringIO import StringIO    oldout,olderr = sys.stdout, sys.stderr    try:        out=[StringIO(), StringIO()]        sys.stdout,sys.stderr = out        yield out    finally:        sys.stdout,sys.stderr = oldout, olderr        out[0] = out[0].getvalue()        out[1] = out[1].getvalue()with capture() as out:    print 'hi'

慕神8447489

对于未来的访问者:Python 3.4 contextlib 通过上下文管理器直接提供了此功能(请参阅Python contextlib help)redirect_stdout:from contextlib import redirect_stdoutimport iof = io.StringIO()with redirect_stdout(f):    help(pow)s = f.getvalue()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python