用鼻子捕获subprocess.Popen()的输出
  我使用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重定向到测试的标准输出,那么所有的东西都会被正确地捕获:
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并将其重定向到stdout。  或者,您可以将sys.__stdout__ stdout sys.__stdout__ ( sys.__stdout__ stdout stdout)或其他文件描述符传递给Popen调用,然后将其刷新到sys.stdout(由鼻子创建的StringIO.StringIO实例),但它看起来不那么干净(与一个简单的打印声明)。 
你可以考虑:
p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE)
q = p.communicate()
output = q[0]
  请参阅communicate以获取来自子流程的更多信息。  干杯! 
