Ich habe einen kleinen Python-Skript geschrieben, das einige Shell-Befehle mit dem subprocess
Modul und eine Hilfsfunktion ausführt:Dekorieren Delegat ein File-Objekt hinzufügen Funktionalität
import subprocess as sp
def run(command, description):
"""Runs a command in a formatted manner. Returns its return code."""
start=datetime.datetime.now()
sys.stderr.write('%-65s' % description)
s=sp.Popen(command, shell=True, stderr=sp.PIPE, stdout=sp.PIPE)
out,err=s.communicate()
end=datetime.datetime.now()
duration=end-start
status='Done' if s.returncode==0 else 'Failed'
print '%s (%d seconds)' % (status, duration.seconds)
die folgenden Zeilen liest die Standardausgabe und Fehler:
s=sp.Popen(command, shell=True, stderr=sp.PIPE, stdout=sp.PIPE)
out,err=s.communicate()
Wie Sie sehen können, werden stdout und stderr nicht verwendet. Nehmen wir an, dass ich die Ausgabe und Fehlermeldungen in eine Protokolldatei, in einer Art und Weise formatiert schreiben möchten, z.B .:
[STDOUT: 2011-01-17 14:53:55] <message>
[STDERR: 2011-01-17 14:53:56] <message>
Meine Frage ist, was ist die Pythonic Weg, es zu tun? Ich dachte an drei Optionen:
- Übernehmen Sie das Dateiobjekt und überschreiben Sie die
write
Methode. Verwenden Sie eine Delegate-Klasse, diewrite
implementiert. - Verbinden Sie sich mit der
PIPE
selbst in irgendeiner Weise.
UPDATE: Referenz-Testskript
ich die Ergebnisse mit diesem Skript überprüft, gespeichert als test.py
:
#!/usr/bin/python
import sys
sys.stdout.write('OUT\n')
sys.stdout.flush()
sys.stderr.write('ERR\n')
sys.stderr.flush()
Irgendwelche Ideen?
ich aufgeben. Ich konnte die Datei umschließen (Unterklasse), so dass Schreibvorgänge Timestamp und Dateititel hinzufügen, aber Popen funktioniert auf FDS und ich kann nicht sehen, wo die Schreibvorgänge passieren. Sieht aus, als wäre es nur 'os.execvp' und der stdout-Griff ist irgendwo magisch. Also habe ich Popen unterklassiert, aber es ignoriert die Tatsache, dass es umwickelte Dateien und eine Karte von fd: title übergeben wurde. – TryPyPy