ho scritto un piccolo script Python che esegue alcuni comandi di shell utilizzando il modulo subprocess
e una funzione di supporto:Decorare delegato un oggetto File per aggiungere funzionalità
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)
Le seguenti righe si legge l'output standard e errore:
s=sp.Popen(command, shell=True, stderr=sp.PIPE, stdout=sp.PIPE)
out,err=s.communicate()
Come si può vedere, stdout e stderr non vengono utilizzati. Supponiamo che voglio scrivere i messaggi di output e di errore in un file di log, in modo formattato, per es .:
[STDOUT: 2011-01-17 14:53:55] <message>
[STDERR: 2011-01-17 14:53:56] <message>
La mia domanda è, qual è il modo più Pythonic per farlo? Ho pensato a tre opzioni:
- Ereditare l'oggetto file e sovrascrivere il metodo
write
. - Utilizzare una classe Delegate che implementa
write
. - Connettersi allo
PIPE
stesso in qualche modo.
UPDATE: riferimento script di test
Sto controllando i risultati con questo script, salvato come test.py
:
#!/usr/bin/python
import sys
sys.stdout.write('OUT\n')
sys.stdout.flush()
sys.stderr.write('ERR\n')
sys.stderr.flush()
Tutte le idee?
mi arrendo. Sono stato in grado di avvolgere (sottoclasse) il file in modo che le scritture aggiungano timestamp e titolo del file, ma Popen lavora su fds e non riesco a vedere dove avvengono le scritture. Sembra che sia solo "os.execvp" e che l'handle dello stdout sia magico. Così ho sottoclassato Popen ma ignora il fatto che sono stati passati file compressi e una mappa di fd: title. – TryPyPy