为什么可能使用我自己的类覆盖sys.stdout但不覆盖subprocess.Popen.stdout。 如果可以覆盖,请告诉我如何......
我正在开发一些GUI项目,我想在“real_time”中打印text_view上的其他一些程序的输出,而不是在一切都完成之后。
当我覆盖sys.stdout时,我会做这样的事情:
class MyStdOut :
def __init__(self) : self.text = ""
def write(self, string) : self.text += string
这是一些程序'pyscript.py'
import os
def main() :
for i in range(10) :
print i
os.system('sleep 0.1') ## this is just to make some delay, i did also 3 loops
if __name__ == '__main__' : main()
这是主程序:
import subprocess as sub
def main() :
popen = sub.Popen('./pyscript.py', stdout=sub.PIPE)
for line in popen.stdout : print 'Line :', line
print 'Main done'
if __name__ == '__main__' : main()
仍然不是'实时',我在结束时得到了所有东西。
我也尝试过沟通,但结果相同。
在我的真实程序中,我必须在text_view(GUI GTK +)上打印其他程序的输出。我怀疑subprocess.stdout必须是文件,但是当我试图创建一个继承自IOBase的类时,我也遇到了错误。
每个人都说这是可能的,但我仍然尝试了许多不同的方法,但没有成功。
答案 0 :(得分:2)
您可以使用以下方法实现相同目标:
p = Popen(args, ..., stdout=subprocess.PIPE)
for line in p.stdout:
print line
其中p.stdout
的行为类似于PIPE,因此您可以在它到达时立即从中读取数据。这不是严格的实时,因为一些缓冲起作用,但这仍然是一个可行的替代方案。