好的..所以可能一个例子是解释这个问题的好方法
所以我有这样的事情:
if __name__=="__main__"
result = foobar()
sys.stdout.write(str(result))
sys.stdout.flush()
sys.exit(0)
现在从ruby脚本调用这个脚本..基本上它在那里解析结果。 但是foobar()有很多打印声明..而且stdout也刷新了所有这些打印件。 有没有办法(除了记录mathods)我可以在这里修改一些自动抑制那些打印的东西,只是刷新这个结果? 感谢
答案 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。将其重定向到内部管道,然后读取您的管道并过滤掉不需要的线路。这将让你只保留你感兴趣的行。