2011-12-15 9 views
11

Mam wadliwy moduł python trzeciej strony, który jest wyprowadzany do stdout lub stderr podczas importowania i jest to przełamanie wyjścia z moich unittests.Jak tymczasowo ukryć stdout lub stderr podczas uruchamiania unittest w Pythonie

Jak mogę tymczasowo przekierować stdout w celu ukrycia jego danych wyjściowych.

Limit to Python 2.5 składni :)

Aktualizacja, zapomniałem wspomnieć, że sys.stdout i sys.__stderr__ metody nie działają w tym przypadku. O ile mi wiadomo, ten wadliwy moduł używa natywnego kodu.

Odpowiedz

16

Można zrobić to tak:

>>> 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', nauczyłeś się czegoś! +1 – juliomalegria

+0

Twój przykład powinien zadziałać, próbowałem nawet zmienić 'sys .__ stdout__' i' sys .__ stderr__' ale nadal otrzymuję wynik ': [' – sorin

20

Można również użyć mock pozwolić ci załatać sys.stdout i sys.stderr dla ciebie, gdy moduł jest importowany. Przykładem modułu badawczego, że za pomocą tej strategii będzie:

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 

gdzie bad_module jest moduł osoba trzecia, która drukuje do sys.stdout i sys.stderr gdy jest importowany.

+0

Czy ta część '' mock' działałaby, gdyby 'stdout' jest zapisywany podczas importu, jak wskazano w PO? – MattH

+0

@MattH Masz rację, przykład jest błędny. Uporządkowałem moją odpowiedź na patch sys.stdout i sys.stderr tylko wtedy, gdy moduł jest importowany. Dziękuję za twój komentarz. – jcollado

+0

+1 Interesujące, nie jestem zaznajomiony z 'mock'. Domyślam się, że nie potrzebujesz już 'import unittest'. – MattH

Powiązane problemy