2011-12-07 23 views
5

Quiero registrar la salida std de un trozo de código Python a un archivo, utilizando el 'con' declaración:la salida estándar de registro y stderr al archivo usando Python conectarse 'con' declaración

with log_to_file('log'): 
    # execute code 

es el más fácil manera de hacer esto para definir la log_to_file manualmente, por ejemplo:

import sys 

class log_to_file(): 
    def __init__(self, filename): 
     self.f = open(filename, 'wb') 

    def __enter__(self): 
     self.stdout = sys.stdout 
     self.stderr = sys.stderr 
     sys.stdout = self.f 
     sys.stderr = self.f 

    def __exit__(self, type, value, traceback): 
     sys.stdout = self.stdout 
     sys.stderr = self.stderr 

o hay una clase incorporada que puede hacer esto ya?

+0

Tome un vistazo a [esta] (http://stackoverflow.com/questions/616645/how-do-i-duplicate-sys-stdout-to-a-log-file-in-python) pregunta. Parece lo que estás buscando. Tenga en cuenta que una de las respuestas usa el módulo de registro existente, mientras que otras usan multiprocesamiento. – thegrinner

+1

Su enfoque es bueno, incluso si pierde cerrar el archivo en '__exit__' :) Me gusta. – tito

+1

¿Qué tipo de respuesta esperas? Lo daré como un comentario: No, no hay una clase incorporada que haga eso. –

Respuesta

2

Lo único que podría sugerir es usar el decorador contextmanager, pero no estoy seguro de que esto sea realmente mejor.

from contextlib import contextmanager 
@contextmanager 
def stdouterrlog(logfile): 
    with open(logfile, 'wb') as lf: 
    stdout = sys.stdout 
    stderr = sys.stderr 
    sys.stdout = lf 
    sys.stderr = lf 
    yield lf # support 'with stdouterrlog(x) as logfile' 
    sys.stdout = stdout 
    sys.stderr = stderr 
+0

¿Por qué no utilizar el administrador de contexto inherente al' archivo' ¿objetos? Es decir, tener el cuerpo de 'stdouterrlog' be' con open (archivo de registro, 'wb') como archivo de registro: \ n (do sys.stdout cosas ...) \ n yield logfile' \ n (deshacer cosas de sys.stdout. ..) – detly

+0

Sí, eso ahorraría una línea adicional. – wberry

+1

... excepto que probablemente también deba tener todo incluido en un bloque 'try' /' finally', de lo contrario un error no controlado dejará abierto el archivo de registro. – detly

Cuestiones relacionadas