python - 用 Nose 捕获 subprocess.Popen() 的输出

标签 python nose nosetests

我正在使用 nose测试使用 subprocess.Popen() 调用脚本的应用程序。 capture 都不是或 logcapture插件似乎捕获了这个脚本的输出。有没有一种简单的方法可以将此输出通过管道传输到 Nose ?

这是我到目前为止所做的尝试;请注意“捕获我”未被捕获:

example.py:

if __name__ == '__main__':
    print 'Capture me'

测试.py:

import subprocess
import sys


def test_popen():
    # nose's capture plugin replaces sys.stdout with a StringIO instance.
    # subprocess.Popen() expects stdout to have a fileno property, which
    # StringIO doesn't, so fake it.
    sys.stdout.fileno = lambda: 1

    subprocess.Popen(['python', 'example.py'], stdout=sys.stdout)
    assert False # Force test to fail so we see nose output

输出:

$ nosetests test.py
F
======================================================================
FAIL: test.test_popen
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/pmdarrow/Envs/example/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/pmdarrow/Code/example/API/test.py", line 8, in test_popen
    assert False
AssertionError

----------------------------------------------------------------------
Ran 1 test in 0.004s

FAILED (failures=1)
Capture me

最佳答案

您必须注意几个问题。我可能会重复@arbunet 的回答,但请耐心等待。因此,如果您等待进程完成,并将进程的标准输出重定向到测试的标准输出,一切都会被 nose 正确捕获:

import subprocess
import sys

def test_popen():
    p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE)
    out, err = p.communicate()
    print out

    assert False

这里创建了 PIPE 并使用 print 语句将其重定向到标准输出。或者,您可以将 sys.__stdout__(未受干扰的测试标准输出)或其他文件描述符传递给 Popen 调用,然后将其刷新到 sys.stdout(由 nose 创建的 StringIO.StringIO 实例),但是它看起来不太干净(与简单的打印语句相比)。

关于python - 用 Nose 捕获 subprocess.Popen() 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23679431/

相关文章:

python - 使用 `abort(404)` 时引发 TypeError

python - 检测nosetests中是否加载了插件

python - 如何防止 nose 导入 __init__.py 文件?

python - 如何让一个 python 文件运行另一个?

python - 如何在 Pandas 中使用 Apply 函数来应用/lambda?

python - 使用 beautifulsoup 解析 HTML 给出 "None"

python - 在多进程模式下运行 Nose 测试时,导入未得到正确处理

python - 当名称已在同一模块中定义时,名称未定义错误

python - 以机器可读的形式列出 Nose 的测试

python - 启用 HTML 报告时禁用向 STDOUT 报告 Nose 覆盖率?