【发布时间】:2011-12-15 15:43:03
【问题描述】:
我有一个错误的第三方 python 模块,它在导入时输出到 stdout 或 stderr,这破坏了我的单元测试的输出。
如何临时重定向stdout 以隐藏其输出。
仅限于 Python 2.5 语法:)
更新,我忘了提到 sys.stdout 和 sys.__stderr__ 方法在这种情况下不起作用。据我所知,这个故障模块使用的是本机代码。
【问题讨论】:
标签: python
我有一个错误的第三方 python 模块,它在导入时输出到 stdout 或 stderr,这破坏了我的单元测试的输出。
如何临时重定向stdout 以隐藏其输出。
仅限于 Python 2.5 语法:)
更新,我忘了提到 sys.stdout 和 sys.__stderr__ 方法在这种情况下不起作用。据我所知,这个故障模块使用的是本机代码。
【问题讨论】:
标签: python
您也可以使用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 的第三方模块。
【讨论】:
stdout,解决方案的这部分 mock 是否有效?
mock。我猜你不再需要import unittest了。
from contextlib import nested 将with 更简洁地写成with nested(patch('sys.stdout', devnull), patch('sys.stderr', devnull)):
你可以这样做:
>>> 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__ 但仍然得到输出 :[