我想捕获和显示我通过 Python 的子进程调用的进程的输出。
我以为我可以将我的类文件对象作为命名参数 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 来捕获输出,并手动显示它,但我只能在进程完成后让它显示输出。但是,我想实时查看输出。