【发布时间】:2014-02-20 18:09:20
【问题描述】:
根据主题行,是否有一个标准的 Python 2.7 库调用,我可以像这样使用:
(returncode, stdout, stderr) = invoke_subprocess(args, stdin)
关键是我想要所有三种形式的输出:返回码和来自 stdout 和 stderr 的整个(和单独的)内容。我希望在 subprocess 模块中找到类似的东西,但我能看到的最接近的是subprocess.check_output,它给出了三分之二(返回码和标准输出)。
还有其他关于堆栈溢出的问题建议将 stderr 传递到 stdout,但我需要将它们分开,因为我正在使用 Python 来驱动一些非 Python 应用程序的测试,在这些应用程序中我试图区分显示的输出在哪些流上。例如,我想验证人类可读的错误消息是否显示在标准错误中,但只有机器可解析的输出数据显示在标准输出中。
我想我想要的是一个简单的四线......
def method(args, input):
from subprocess import Popen, PIPE
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(input)
return (p.poll(), out, err)
...鉴于subprocess 模块中大部分与此类似的其他方法的数量,我对目前还没有这样的方法感到有点惊讶。它是否存在并且我错过了它,或者它是否存在于其他一些标准 Python 2.7 模块中?或者有什么微妙的原因说明这样的方法是个坏主意?
【问题讨论】:
-
“我想我想要的是一个简单的四线......所以我有点惊讶,现在还没有这样的方法......” - 正如你所说,这是一个简单的 4 线。一般来说,如果我必须编写 4 行代码来做某事,我并不感到惊讶...... :) 虽然,FWIW,我会使用
p.returncode而不是p.poll(),因为returncode也是由 @987654328 设置的@. -
在 Python 3.5 及更高版本中,使用
subprocess.run()。
标签: python python-2.7 subprocess