我一直在阅读关于子进程模块的Python文档(请参阅here),其中谈到了subprocess.check_output()
命令,这似乎正是我所需要的。
但是,当我尝试使用它时,我得到一个错误,它不存在,并且当我运行dir(subprocess)
时,它没有列出。
我运行的是Python 2.6.5,我使用的代码如下:
import subprocess
subprocess.check_output(["ls", "-l", "/dev/null"])
有人知道为什么会发生这种事吗?
发布于 2011-01-27 18:07:19
它是在2.7版本中引入的,请参阅docs。
如果需要输出,请使用subprocess.Popen:
>>> import subprocess
>>> output = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0]
发布于 2015-12-03 08:02:47
多亏了猴子补丁的建议(我的尝试失败了--但我们消耗了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
https://stackoverflow.com/questions/4814970
复制相似问题