subprocess.check_output()似乎不存在(Python 2.6.5)

我一直在阅读有关subprocess模块的Python文档(请参阅此处 ),并且讨论了一个subprocess.check_output()命令,它似乎正是我所需要的。

但是,当我尝试和使用它,我得到一个错误,它不存在,当我运行dir(subprocess)它没有列出。

我正在运行Python 2.6.5,我已经使用的代码如下:

 import subprocess subprocess.check_output(["ls", "-l", "/dev/null"]) 

有谁知道为什么会发生这种情况?

它在2.7中被引入请参阅文档 。

使用subprocess.Popen如果你想输出:

 >>> import subprocess >>> output = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0] 

如果你想运行的代码被大量使用,但代码不需要长期维护(或者需要快速修复,而不pipe将来会有什么潜在的维护问题),那么你可以打鸭子(又名猴子补丁)它在哪里importsubprocess…

从2.7提取代码,然后插入它…

 import subprocess if "check_output" not in dir( subprocess ): # duck punch it in! def f(*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) return output subprocess.check_output = f 

可能需要轻微的烦躁。

请记住,虽然你有责任保持这样的肮脏的小后卫。 如果在最新的python中发现并纠正了错误,那么你a)必须注意到,并且b)如果你想保持安全,就更新你的版本。 而且,自己压倒一切并定义内部function是下一个人最糟糕的噩梦,特别是当下一个人是你几年下来的时候,你忘记了上次你所做的那些粗暴的黑客! 总之:这是一个很好的主意。

由于猴子补丁的build议(和我的尝试失败 – 但我们正在使用CalledProcessError输出,所以需要猴子补丁)

发现一个工作2.6补丁在这里: http : //pydoc.net/Python/pep8radius/0.9.0/pep8radius.shell/

 """Note: We also monkey-patch subprocess for python 2.6 to give feature parity with later versions. """ try: from subprocess import STDOUT, check_output, CalledProcessError except ImportError: # pragma: no cover # python 2.6 doesn't include check_output # monkey patch it in! import subprocess STDOUT = subprocess.STDOUT def check_output(*popenargs, **kwargs): if 'stdout' in kwargs: # pragma: no cover raise ValueError('stdout argument not allowed, ' 'it will be overridden.') process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) output, _ = 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 subprocess.check_output = check_output # overwrite CalledProcessError due to `output` # keyword not being available (in 2.6) 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) subprocess.CalledProcessError = CalledProcessError