如何在Python中运行unittest时临时隐藏stdout或stderr

如何在Python中运行unittest时临时隐藏stdout或stderr,python,Python,我有一个有故障的第三方python模块,在导入时输出到stdout或stderr,这破坏了unittests的输出 如何临时重定向stdout,以隐藏其输出 限制为Python 2.5语法:) Update,我忘了提到sys.stdout和sys.\uu stderr\uuu方法在这种情况下不起作用。据我所知,此故障模块使用的是本机代码。您可以这样做: >>> import sys, os >>> _stderr = sys.stderr >>&g

我有一个有故障的第三方python模块,在导入时输出到stdout或stderr,这破坏了unittests的输出

如何临时重定向
stdout
,以隐藏其输出

限制为Python 2.5语法:)


Update,我忘了提到
sys.stdout
sys.\uu stderr\uuu
方法在这种情况下不起作用。据我所知,此故障模块使用的是本机代码。

您可以这样做:

>>> 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
您还可以使用在导入模块时为您修补
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
的第三方模块。

如果导入过程中如OP所示写入
stdout
,则此
mock
解决方案的一部分会起作用吗?@MattH您是对的,示例是错误的。只有在导入模块时,我才对补丁sys.stdout和sys.stderr给出了答案。感谢您的反馈。+1有意思,我不熟悉
mock
。我想你不再需要导入单元测试了。@MattH我同意。我已经从示例中删除了该导入。再次感谢。您可以使用
from contextlib import nested
编写
,使
与nested(patch('sys.stdout',devnull),patch('sys.stderr',devnull)):您的示例应该可以工作,我甚至试着改变sys.\uuuu stdout\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu