我正在使用nose来测试使用subprocess.Popen()
来调用脚本的应用程序。 capture或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
答案 0 :(得分:3)
您必须注意几个问题。我可能会重复@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并使用print语句重定向到stdout。或者,您可以将sys.__stdout__
(测试的未受干扰的stdout)或其他文件描述符传递给Popen调用,然后将其刷新到sys.stdout(由nose创建的StringIO.StringIO实例),但它看起来不那么干净(与简单的印刷语句相比)。
答案 1 :(得分:0)
您可以考虑:
p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE)
q = p.communicate()
output = q[0]
有关子进程的更多信息,请参阅communicate
。干杯!