我希望能够通过Python的subprocess来捕获并显示进程的输出。
我认为我可以将我的文件对象作为命名参数stdout和stderr传递。
我可以看到它访问了fileno属性 - 所以它正在处理该对象。 然而,write()方法从未被调用。我的方法完全错误还是我只是忽略了什么?
class Process(object):
class StreamWrapper(object):
def __init__(self, stream):
self._stream = stream
self._buffer = []
def _print(self, msg):
print repr(self), msg
def __getattr__(self, name):
if not name in ['fileno']:
self._print("# Redirecting: %s" % name)
return getattr(self._stream, name)
def write(self, data):
print "###########"
self._buffer.append(data)
self._stream.write(data)
self._stream.flush()
def getBuffer(self):
return self._buffer[:]
def __init__(self, *args, **kwargs):
print ">> Running `%s`" % " ".join(args[0])
self._stdout = self.StreamWrapper(sys.stdout)
self._stderr = self.StreamWrapper(sys.stderr)
kwargs.setdefault('stdout', self._stdout)
kwargs.setdefault('stderr', self._stderr)
self._process = subprocess.Popen(*args, **kwargs)
self._process.communicate()
更新:
我希望能够使用ANSI控制字符来移动光标并覆盖之前输出的内容,这也是我想要解决的问题。我不知道这是否是正确的术语,但以下是我所指的示例:我正在尝试自动化一些GIT操作,他们有一个进度条,在每次更新时都不需要写入新的一行。
更新2
对我来说,很重要的一点是子进程的输出可以立即显示出来。我已经尝试使用subprocess.PIPE来捕获输出,并手动显示它,但我只能在进程完成后才看到输出。然而,我希望能够实时地看到输出。