什么是相当于python的subprocess.check_call返回标准输出的内容?

我想要一个很好的方法来匹配CalledProcessError的接口 – 也就是说,当它失败的时候,它会抛出CalledProcessError ,是同步的,&c – 而不是返回命令的返回码(如果它是这样的话)返回程序的输出,或者只是stdout,或者是(stdout,stderr)的一个元组。

有人有这样的方法吗?

Python 2.7+

 from subprocess import check_output as qx 

Python <2.7

从subprocess.py :

 import subprocess def check_output(*popenargs, **kwargs): if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise subprocess.CalledProcessError(retcode, cmd, output=output) return output class CalledProcessError(Exception): def __init__(self, returncode, cmd, output=None): self.returncode = returncode self.cmd = cmd self.output = output def __str__(self): return "Command '%s' returned non-zero exit status %d" % ( self.cmd, self.returncode) # overwrite CalledProcessError due to `output` keyword might be not available subprocess.CalledProcessError = CalledProcessError 

另请参见捕获系统命令输出作为可能的check_output()实现的另一个示例的string 。

我无法评论格式,所以这是对JF Sebastian的回答

我发现这非常有帮助,所以我想我会添加到这个答案。 我希望能够在代码中无缝检查版本。 这是我做的…

我把上面的代码放到一个名为“subprocess_compat.py”的文件中。 然后在我使用subprocess的代码中。

 import sys if sys.version_info < (2, 7): import subprocess_compat subprocess.check_output = subprocess_compat.check_output 

现在在代码中的任何地方,我可以用我想要的参数调用“subprocess.check_output”,无论我使用的是哪个版本的python,它都可以工作。

该函数以string列表的forms返回terminal输出。

 import subprocess,sys def output(cmd): cmd_l = cmd.split() output = subprocess.Popen(cmd_l, stdout=subprocess.PIPE).communicate()[0] output = output.decode("utf-8") return (output)