Обернуть подпроцесс stdout / stderr

Я хотел бы как захватить, так и отобразить вывод процесса, который я вызываю через Python ' Однако метод 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 для захвата вывода и отображения его вручную, но мне удалось заставить его отображать вывод только после завершения процесса. Однако я бы хотел видеть результат в реальном времени.

7
задан rypel 22 May 2013 в 16:31
поделиться