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

Python-捕获执行外部程序的函数调用的所有输出,python,io,output,nose,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)

我正在用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中,所有的输出都很好,所以我想知道是否有一种方法可以捕获所有这些内容并对其进行解析。

您可以在
捕获
类中提供一个从
系统重定向的镜头,以消除nose或nose中的其他插件干扰您捕获输出的可能性。此对象包含程序开始时的stdout原始值,如前所述,只有当可执行进程已将其stdout流正确重定向到python解释器的流时,此对象才会起作用

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

最好的方法是使用
subprocess.PIPE
communicate()
(类似)从
subprocess.Popen
调用中显式捕获stdout,并在测试中打印出来,让鼻子捕获它。
subprocess
调用很有可能是通过shell完成的,并且在python控制的标准输出之外


如果您无法修改此代码,您可以随时对其进行修补;-)

您可能需要包含实际运行外部程序的函数的代码,因为这取决于调用subprocess.Popen的方式(如果这是运行exe的方式)。我希望可以。这个函数是测试框架的一部分,我不能修改它(我在测试脚本中导入了它)。你确定你缺少的东西实际上是写在stdout而不是stderr中的吗?否则,如果您无法获得启动
DiagnosticTool.exe
的代码,您可能在python中没有运气。我不是windows用户,但可能与nose有关?
nose
有一个命令行参数
--无捕获
,它在测试装置中保留
stdout
,这将允许您捕获/解析新流程的
标准输出。我不知道你说的“猴子之路”到底是什么意思。然而,我能够联系负责该插件的人员,并要求他们捕获并返回函数的输出。我指的是动态修改插件代码,使之成为实际捕获STDOUT的其他东西,但看起来您确实有能力正确地完成它。