如果我喜欢:
x = subprocess.Popen(["nosetests",
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", "-v"],
stdout=subprocess.PIPE)
我执行了命令的输出:
test_it_has_an_initial_state (TestStateMachine.FluidityTest) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
但是如果打电话给 x.communicate(),我得到了:
('', None)
如何将该消息保存在变量中,例如?
答案 0 :(得分:4)
问题几乎可以肯定,你的命令是写入stderr以及stdout,而你只是捕获stdout。
如果要将两者合并为一个字符串,请执行以下操作:
x = subprocess.Popen(["nosetests",
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state",
"-v"],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out_and_err, _ = x.communicate()
如果你想把它们作为单独的字符串:
x = subprocess.Popen(["nosetests",
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state",
"-v"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = x.communicate()
这在[{3}}:
下解释stdin , stdout 和 stderr 分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为...此外, stderr 可以是
STDOUT
,这表示子进程中的stderr数据应该被捕获到与 stdout 相同的文件句柄中
但是,如果您以前从未听说过标准错误,那么您可能不会去寻找这个可以理解......文档假设您知道每个程序的单独输出和错误管道的基本C / POSIX模型。
作为旁注,如果您要运行的只是运行程序并获取其输出,将其stderr与其stdout合并,则无需创建Popen
并调用{{1} } 在上面;只需使用communicate
:
check_output