Как временно скрыть stdout или stderr во время запуска unittest в Python

У меня есть неисправный модуль python третьей стороны, который выводит на stdout или stderr во время его импорта, и это нарушает выходные данные моих unittests.

Как я могу временно перенаправить stdout, чтобы скрыть свой вывод.

Предел синтаксиса Python 2.5:)

Обновить, я забыл упомянуть, что методы sys.stdout и sys.__stderr__ не работают в этом случае. Насколько я знаю, этот неисправный модуль использует собственный код.

Ответ 1

Вы можете сделать это примерно так:

>>> 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

Ответ 2

Вы также можете использовать mock, чтобы вы могли патч sys.stdout и sys.stderr для вас, когда модуль импортируется. Примером модуля тестирования, использующего эту стратегию, будет:

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

где bad_module - это сторонний модуль, который печатает на sys.stdout и sys.stderr при импорте.