如何在python中获取命令输出而不是子进程?

时间:2014-01-15 01:43:30

标签: python subprocess popen communicate

如果我喜欢:

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)

如何将该消息保存在变量中,例如?

1 个答案:

答案 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