问题几乎可以肯定是您的命令正在写入 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()
这在常用参数下进行了解释:
stdin、stdout和stderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为... 此外,stderr can be STDOUT
,这表明来自子进程的 stderr 数据应该被捕获到与stdout相同的文件句柄中。
但是,如果您以前从未听说过标准错误,那么您不会去寻找它是可以理解的……文档假设您知道每个程序的单独输出和错误管道的基本 C/POSIX 模型。
附带说明一下,如果您只想运行一个程序并获取其输出,将其 stderr 与其 stdout 合并,则无需创建Popen
并调用communicate
它;只需使用check_output
:
out_and_err = subprocess.check_output([… args …], stderr=subprocess.STDOUT)