抑制打印为stdout python

时间:2012-03-30 19:57:02

标签: python

好的..所以可能一个例子是解释这个问题的好方法

所以我有这样的事情:

if __name__=="__main__"
    result = foobar()
    sys.stdout.write(str(result))
    sys.stdout.flush()
    sys.exit(0)

现在从ruby脚本调用这个脚本..基本上它在那里解析结果。 但是foobar()有很多打印声明..而且stdout也刷新了所有这些打印件。 有没有办法(除了记录mathods)我可以在这里修改一些自动抑制那些打印的东西,只是刷新这个结果? 感谢

4 个答案:

答案 0 :(得分:18)

您想暂时隐藏(或以其他方式隐藏)标准输出。像这样:

actualstdout = sys.stdout
sys.stdout = StringIO()
result = foobar()
sys.stdout = actualstdout
sys.stdout.write(str(result))
sys.stdout.flush()
sys.exit(0)

您需要为sys.stdout分配类似文件的内容,以便其他方法可以有效地使用它。 StringIO是一个很好的候选者,因为它不需要磁盘访问(它只会在内存中收集)然后被丢弃。

答案 1 :(得分:8)

使用Python 3.4及更高版本,您可以使用redirect_stdout上下文管理器,如下所示:

with redirect_stdout(open(os.devnull, "w")):
    print("This text goes nowhere")
print("This text gets printed normally")

答案 2 :(得分:3)

import sys

class output:
    def __init__(self):
        self.content = []
    def write(self, string):
        self.content.append(string)


if __name__=="__main__":

    out = output()                   
    sys.stdout = out                   #redirecting the output to a variable content

    result = foobar()
    sys.stdout.write(str(result))
    sys.stdout.flush() 

    sys.stdout = sys.__stdout__        #redirecting the output back to std output   
    print "o/p of foo :",out.content

    sys.exit(0)

答案 3 :(得分:1)

This link shows how to redirect stdout in python。将其重定向到内部管道,然后读取您的管道并过滤掉不需要的线路。这将让你只保留你感兴趣的行。