繁体   English   中英

使用nose捕获subprocess.Popen()的输出

[英]Capturing output of subprocess.Popen() with nose

我正在使用nose来测试使用subprocess.Popen()来调用脚本的应用程序。 捕获logcapture插件似乎都不捕获此脚本的输出。 是否有一种简单的方法将此输出传输到鼻子?

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

example.py

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

test.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的回答,但请耐心等待我。 因此,如果您等待进程完成,并将进程'stdout重定向到测试的标准输出,那么将使用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语句重定向到stdout。 或者,您可以将sys.__stdout__ stdout sys.__stdout__ (测试的未sys.__stdout__ stdout)或其他文件描述符传递给Popen调用,然后将其刷新到sys.stdout(由nose创建的StringIO.StringIO实例),但它看起来不那么干净(与之相比)一个简单的印刷声明)。

你可能会考虑:

p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE)
q = p.communicate()
output = q[0]

请参阅communicate以获取子进程的更多信息。 干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM