我正在与Nose一起运行集成测试。在我的一个测试中,我需要获取输出并解析它以找到特定的字符串。
def test_diagnostic_tool():
with Capturing() as output:
failures = run_integration_testing_exe('*', test_exe='DiagnosticTool.exe', use_default_composed_filter=False)
eq_(failures, 0)
class Capturing(list):
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._stringio = StringIO()
return self
def __exit__(self, *args):
self.extend(self._stringio.getvalue().splitlines())
sys.stdout = self._stdout
这不起作用。 'output'变量只包含调用结构中某处打印的一个小字符串。
'run_integration_testing_exe'函数正在调用另一个函数,并在那里调用外部exe程序。在shell中,everthing输出正常,所以我想知道是否有办法捕获所有这些并解析它。
答案 0 :(得分:1)
你可以在sys.__stdout__
课程中从Capturing
重定向,只是为了消除鼻子里的鼻子或其他插件弄乱你捕捉输出的可能性。此对象包含程序开头的stdout的原始值,如上所述in sys docs.这仅在您的可执行进程已正确地将其stdout流重定向到python解释器的流时才有效。
但我认为这没有多大区别。这里的关键是在大多数情况下捕获和重定向sys.stdout不会影响subprocess()函数系列执行的标准I / O流程,我想这是在这里发生的。
您最好的选择是使用subprocess.Popen
和subprocess.PIPE
(如here)明确捕获communicate()
来电中的标准输出,在测试中将其打印出来抓住它。 subprocess
调用很有可能通过shell完成,并且在python可以控制的stdout之外。
如果您无法修改此代码,您可以随时修补它; - )