2

如果我喜欢:

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)

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

4

1 回答 1

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()

这在常用参数下进行了解释:

stdinstdoutstderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为... 此外,stderr can be STDOUT,这表明来自子进程的 stderr 数据应该被捕获到与stdout相同的文件句柄中。

但是,如果您以前从未听说过标准错误,那么您不会去寻找它是可以理解的……文档假设您知道每个程序的单独输出和错误管道的基本 C/POSIX 模型。


附带说明一下,如果您只想运行一个程序并获取其输出,将其 stderr 与其 stdout 合并,则无需创建Popen并调用communicate它;只需使用check_output

out_and_err = subprocess.check_output([… args …], stderr=subprocess.STDOUT)
于 2014-01-15T01:47:33.267 回答