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