Zusammenführen und Synchronisieren von Stdout und Stderr?

Sagen Sie, ich laufe ein Exe aus einem Python-Skript mit:

subprocess.call(cmdArgs,stdout=outf, stderr=errf)

Wenn outf und errf sind Dateideskriptoren von Textdateien.

Gibt es irgendeine Art, wie ich darüber hinaus eine zusammengeführte und synchronisierte Textdatei von Stdout und Stderr generieren kann? Es sollte mit Zeit und Quelle formatiert werden (unser / ir).

Vielen Dank

2 Solutions collect form web for “Zusammenführen und Synchronisieren von Stdout und Stderr?”

Es ist ein bisschen knifflig, da du die Stdout- und Stderr-Datei-Deskriptoren des Unterprozesses abfragen musst, während es läuft, um genaue Zeitstempel zu bekommen. Sie müssen auch die Ausgabe in eine Liste von Zeilen chop, so dass die endgültigen Ergebnisse können zusammengeführt und sortiert werden leicht. Sie konnten die beiden Ströme leicht zusammenführen, wie sie gelesen wurden, aber das war nicht Teil der Frage.

Ich schrieb es schnell, aber es könnte sauberer und kompakter gemacht werden:

 import datetime import os import select import subprocess class Stream(object): def __init__(self, name, impl): self._name = name self._impl = impl self._buf = '' self._rows = [] def fileno(self): "Pass-through for file descriptor." return self._impl.fileno() def read(self, drain=0): "Read from the file descriptor. If 'drain' set, read until EOF." while self._read() is not None: if not drain: break def _read(self): "Read from the file descriptor" fd = self.fileno() buf = os.read(fd, 4096) if not buf: return None if '\n' not in buf: self._buf += buf return [] # prepend any data previously read, then split into lines and format buf = self._buf + buf tmp, rest = buf.rsplit('\n', 1) self._buf = rest now = datetime.datetime.now().isoformat() rows = tmp.split('\n') self._rows += [(now, '%s %s: %s' % (self._name, now, r)) for r in rows] def run(cmd, timeout=0.1): """ Run a command, read stdout and stderr, prefix with timestamp, and return a dict containing stdout, stderr and merged. """ PIPE = subprocess.PIPE proc = subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE) streams = [ Stream('stdout', proc.stdout), Stream('stderr', proc.stderr) ] def _process(drain=0): res = select.select(streams, [], [], timeout) for stream in res[0]: stream.read(drain) while proc.returncode is None: proc.poll() _process() _process(drain=1) # collect results, merge and return result = {} temp = [] for stream in streams: rows = stream._rows temp += rows result[stream._name] = [r[1] for r in rows] temp.sort() result['merged'] = [r[1] for r in temp] return result res = run(['ls', '-l', '.', 'xyzabc']) for key in ('stdout', 'stderr', 'merged'): print print '\n'.join(res[key]) print '-'*40 

Beispielausgabe:

 stdout 2011-03-03T19:30:44.838145: .: stdout 2011-03-03T19:30:44.838145: total 0 stdout 2011-03-03T19:30:44.838338: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 bar stdout 2011-03-03T19:30:44.838518: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 foo ---------------------------------------- stderr 2011-03-03T19:30:44.837189: ls: cannot access xyzabc: No such file or directory ---------------------------------------- stderr 2011-03-03T19:30:44.837189: ls: cannot access xyzabc: No such file or directory stdout 2011-03-03T19:30:44.838145: .: stdout 2011-03-03T19:30:44.838145: total 0 stdout 2011-03-03T19:30:44.838338: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 bar stdout 2011-03-03T19:30:44.838518: -rw-r--r-- 1 pat pat 0 2011-03-03 19:30 foo ---------------------------------------- 

Sie können sie zusammenführen subprocess.STDOUT als das stderr Argument für subprocess.Popen , aber ich weiß nicht, ob sie mit Zeit und Quelle formatiert werden.

  • Zusammenführen eines Python-Skripts Subprozess "Stdout und Stderr, während sie sie unterscheidbar halten
  • Python: Geben Sie die Ausgabe von einer Befehlszeile aus, die mit dem Nullpunktausgang beendet wird
  • Python-Spar-Ausgabe von a für Iteration und Unterprozess für Prüfsumme
  • Python subprocess und unicode execv () arg 2 muss nur Strings enthalten
  • Wie benutzt man Python, um GDB-Unterprozeß zu erstellen und Befehle dynamisch basierend auf Ausgabe zu senden?
  • Python: Wie kann ich die Ausgabe mit dem Subprozess umleiten?
  • Python: Wie kann man Kind-Prozess (es) töten, wenn Eltern sterben?
  • Python-Subprozess mit Timeout und großer Ausgabe (> 64K)
  • Python: Wie kann ich diese Ausgabe umleiten?
  • Python-Ausgabe zur Konsole innerhalb des Subprozesses aus dem Child-Scricpt
  • Wie kann ich alle verfügbaren Daten aus subprocess.Popen.stdout (non blocking) lesen?
  • Python ist die beste Programmiersprache der Welt.