Python - 从执行外部程序的函数调用中捕获所有输出

时间:2014-07-15 18:24:02

标签: python io output nose

我正在与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输出正常,所以我想知道是否有办法捕获所有这些并解析它。

1 个答案:

答案 0 :(得分:1)

你可以在sys.__stdout__课程中从Capturing重定向,只是为了消除鼻子里的鼻子或其他插件弄乱你捕捉输出的可能性。此对象包含程序开头的stdout的原始值,如上所述in sys docs.这仅在您的可执行进程已正确地将其stdout流重定向到python解释器的流时才有效。

但我认为这没有多大区别。这里的关键是在大多数情况下捕获和重定向sys.stdout不会影响subprocess()函数系列执行的标准I / O流程,我想这是在这里发生的。

您最好的选择是使用subprocess.Popensubprocess.PIPE(如here)明确捕获communicate()来电中的标准输出,在测试中将其打印出来抓住它。 subprocess调用很有可能通过shell完成,并且在python可以控制的stdout之外。

如果您无法修改此代码,您可以随时修补它; - )