Python,为什么我不能覆盖Popen.stdout

时间:2011-03-27 17:00:25

标签: python stdout

为什么可能使用我自己的类覆盖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的类时,我也遇到了错误。

每个人都说这是可能的,但我仍然尝试了许多不同的方法,但没有成功。

1 个答案:

答案 0 :(得分:2)

您可以使用以下方法实现相同目标:

p = Popen(args, ..., stdout=subprocess.PIPE)
for line in p.stdout:
   print line

其中p.stdout的行为类似于PIPE,因此您可以在它到达时立即从中读取数据。这不是严格的实时,因为一些缓冲起作用,但这仍然是一个可行的替代方案。