2012-03-30 9 views
10

Ok .. Por lo tanto, probablemente, un ejemplo es una buena manera de explicar este problemade impresión como la supresión de la salida estándar pitón

Así que tener algo como esto:

if __name__=="__main__" 
    result = foobar() 
    sys.stdout.write(str(result)) 
    sys.stdout.flush() 
    sys.exit(0) 

Ahora este script se está llamando desde un rubí script ... y básicamente analiza el resultado allí. Pero foobar() tiene una gran cantidad de declaraciones de impresión ... y stdout vacía todas esas impresiones también. ¿Hay alguna manera (además de registrar mathods) de modificar algo aquí que suprime automáticamente esas impresiones y simplemente vacía este resultado? Gracias

Respuesta

17

Desea sombrear (u ocultar) temporalmente la extensión estándar. Algo como esto:

actualstdout = sys.stdout 
sys.stdout = StringIO() 
result = foobar() 
sys.stdout = actualstdout 
sys.stdout.write(str(result)) 
sys.stdout.flush() 
sys.exit(0) 

necesita asignar algo que es de tipo fichero a sys.stdout de modo que otros métodos se pueden utilizar de manera eficaz. StringIO es un buen candidato porque no requiere acceso al disco (simplemente se acumulará en la memoria) y luego se descarta.

+0

impresionante .. justo lo que necesitaba :) – Fraz

+4

¿Qué hay de usar 'sys.stdout = open (os.devnull, 'w')' en lugar de 'StringIO()'? – ovgolovin

+0

@ovgolovin: definitivamente razonable si no hay expectativas de que alguna vez necesites la salida. Con StringIO puede recuperarlo si es necesario antes de restablecer el valor original de 'stdout'. –

3
import sys 

class output: 
    def __init__(self): 
     self.content = [] 
    def write(self, string): 
     self.content.append(string) 


if __name__=="__main__": 

    out = output()     
    sys.stdout = out     #redirecting the output to a variable content 

    result = foobar() 
    sys.stdout.write(str(result)) 
    sys.stdout.flush() 

    sys.stdout = sys.__stdout__  #redirecting the output back to std output 
    print "o/p of foo :",out.content 

    sys.exit(0) 
6

con Python 3.4 y hasta puede utilizar el ContextManager redirect_stdout como esto:.

with redirect_stdout(open(os.devnull, "w")): 
    print("This text goes nowhere") 
print("This text gets printed normally") 
Cuestiones relacionadas