我正在使用 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/