为了账号安全,请及时绑定邮箱和手机立即绑定

从脚本捕获标准输出?

从脚本捕获标准输出?

阿波罗的战车 2019-10-09 15:37:53
假设有一个脚本执行以下操作:# module writer.pyimport sysdef write():    sys.stdout.write("foobar")现在,假设我要捕获write函数的输出并将其存储在变量中以进行进一步处理。天真的解决方案是:# module mymodule.pyfrom writer import writeout = write()print out.upper()但这是行不通的。我想出了另一个解决方案,它可以工作,但是请告诉我是否有解决问题的更好方法。谢谢import sysfrom cStringIO import StringIO# setup the environmentbackup = sys.stdout# ####sys.stdout = StringIO()     # capture outputwrite()out = sys.stdout.getvalue() # release output# ####sys.stdout.close()  # close the stream sys.stdout = backup # restore original stdoutprint out.upper()   # post processing
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

设置stdout是一种合理的方法。另一个是将其作为另一个进程来运行:


import subprocess


proc = subprocess.Popen(["python", "-c", "import writer; writer.write()"], stdout=subprocess.PIPE)

out = proc.communicate()[0]

print out.upper()


查看完整回答
反对 回复 2019-10-09
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

这是代码的上下文管理器版本。它产生两个值的列表。第一个是stdout,第二个是stderr。


import contextlib

@contextlib.contextmanager

def 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'


查看完整回答
反对 回复 2019-10-09
?
慕神8447489

TA贡献1780条经验 获得超1个赞

对于未来的访问者:Python 3.4 contextlib 通过上下文管理器直接提供了此功能(请参阅Python contextlib help)redirect_stdout:


from contextlib import redirect_stdout

import io


f = io.StringIO()

with redirect_stdout(f):

    help(pow)

s = f.getvalue()


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 440 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信