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 を使用して出力をキャプチャし、手動で表示しようとしましたが、プロセスが完了してから出力を表示することしかできませんでした。ただし、出力をリアルタイムで見たいと思います。