Python,为什么可以';i覆盖Popen.stdout

Python,为什么可以';i覆盖Popen.stdout,python,stdout,Python,Stdout,为什么可以用我自己的类重写sys.stdout而不是subprocess.Popen.stdout。 如果可以覆盖,请告诉我如何 我正在做一些GUI项目,我想在“实时”的文本视图上打印其他程序的输出,而不是在所有事情都完成的时候 当我重写sys.stdout时,我会执行如下操作: class MyStdOut : def __init__(self) : self.text = "" def write(self, string) : self.text += string 下面是一些

为什么可以用我自己的类重写sys.stdout而不是subprocess.Popen.stdout。 如果可以覆盖,请告诉我如何

我正在做一些GUI项目,我想在“实时”的文本视图上打印其他程序的输出,而不是在所有事情都完成的时候

当我重写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()
但它不是“实时的”,当它结束时,我得到了一切

我也尝试过沟通,但得到了同样的结果

在我的实际程序中,我必须在文本视图(GUI GTK+)上打印其他程序的输出。我怀疑subprocess.stdout必须是file,但当我试图创建从IOBase继承的类时,我也遇到了错误


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

您可以使用以下方法实现同样的效果:

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

其中
p.stdout
的行为类似于管道,因此您可以在它到达后立即从中读取数据。这不是严格的实时性,因为有些缓冲起作用,但这仍然是一个可行的选择。

这段代码与覆盖sys.stdout有什么关系?这是一个与sys.stdout完全无关的类。实现流不仅仅是实现write()。您试图解决的实际问题是什么。要精确,要冗长——否则你的问题就没有多大意义。不,我仍然有相同的结果,当一切都完成时,我会得到输出。