2011-12-15 15 views
11

Tengo un módulo de python de terceros defectuoso que está produciendo stdout o stderr mientras se importa y esto está interrumpiendo la salida de mis unittests.Cómo ocultar temporalmente stdout o stderr mientras se ejecuta una prueba de unidad en Python

¿Cómo puedo redireccionar temporalmente el stdout para ocultar su salida.

Limitar a Python 2.5 sintaxis :)

actualización, se me olvidó mencionar que sys.stdoutsys.__stderr__ y métodos no funcionan en este caso. Hasta donde yo sé, este módulo defectuoso está usando código nativo.

Respuesta

16

Usted puede hacer que algo como esto:

>>> import sys, os 
>>> _stderr = sys.stderr 
>>> _stdout = sys.stdout 
>>> null = open(os.devnull,'wb') 
>>> sys.stdout = sys.stderr = null 
>>> print "Bleh" 
>>> sys.stderr = _stderr 
>>> sys.stdout = _stdout 
>>> print "Bleh" 
Bleh 
+6

'os.devnull', ¡aprendí algo! +1 – juliomalegria

+0

Su ejemplo debería funcionar, incluso traté de cambiar 'sys .__ stdout__' y' sys .__ stderr__', pero aún así obtengo el resultado ': [' – sorin

20

También puede utilizar mock para dejar un parche sys.stdout y sys.stderr para que cuando se importa el módulo. Un ejemplo de un módulo de pruebas de que el uso de esta estrategia sería:

import os 
devnull = open(os.devnull, 'w') 

from mock import patch 
with patch('sys.stdout', devnull): 
    with patch('sys.stderr', devnull): 
     import bad_module 

# Test cases writen here 

donde bad_module es el tercer módulo del partido que se está imprimiendo a sys.stdout y sys.stderr cuando se importa.

+0

¿Funcionaría esta parte 'simulada' de la solución si 'stdout' se está escribiendo durante la importación como indica el PO? – MattH

+0

@MattH Tienes razón, el ejemplo es incorrecto. He actualizado mi respuesta al parche sys.stdout y sys.stderr solo cuando se importa el módulo. Gracias por sus comentarios. – jcollado

+0

+1 Interesante, no estoy familiarizado con 'simulacro'. Sin embargo, creo que ya no necesitas el 'import unittesttest'. – MattH

Cuestiones relacionadas