Python错误:subprocess.CalledProcessError:命令返回非零退出状态1 [重复]

Posted

技术标签:

【中文标题】Python错误:subprocess.CalledProcessError:命令返回非零退出状态1 [重复]【英文标题】:Python error: subprocess.CalledProcessError: Command returned non-zero exit status 1 [duplicate] 【发布时间】:2016-07-11 05:50:21 【问题描述】:

我需要计算 Python 脚本中 shell 命令输出的行数。

这个函数在有输出的情况下可以正常工作,但如果输出为空,它会给出一个错误,如错误输出中所述。 如果命令的输出是None,我试图避免使用if 语句,但这没有帮助。

#!/usr/bin/python
import subprocess

lines_counter=0
func="nova list | grep Shutdown "
data=subprocess.check_output(func, shell=True)
if data is True:
       for line in data.splitlines():
               lines_counter +=1
print lines_counter

错误输出:

data=subprocess.check_output(func, shell=True)
  File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'nova list | grep Shutdown ' returned non-zero exit status 1

【问题讨论】:

【参考方案1】:

如果您正在运行的grep 命令与任何内容都不匹配,则会以退出状态1 退出。该非零退出代码导致check_output 引发异常(这就是其名称中“检查”部分的含义)。

如果您不希望失败的匹配引发异常,请考虑使用subprocess.getoutput 而不是check_output。或者您可以更改命令以避免非零退出代码:

func = "nova list | grep Shutdown || true"

【讨论】:

但是 subprocess.getoutput 似乎只存在于 python3 中。 (python2 文档中未提及)【参考方案2】:

您可以用 try-except 块包围 subprocess 调用:

try:
    data = subprocess.check_output(func, shell=True)
except Exception:
    data = None

另外,写if data:would be better而不是if data is True:

【讨论】:

两个建议的解决方案都很好。 太棒了!尽管您不需要同时使用两者。在我看来,@Blckknght 的答案更好,因为它避免了使用异常,从而使代码更快(我是赞成它的人)。我写我的答案只是为了添加另一种方法。【参考方案3】:

这就是它的工作原理 如第一个解决方案中所述: 如果不匹配任何内容,则 grep 命令以退出状态 1 退出。该非零退出代码导致 check_output 引发异常(这就是其名称的“检查”部分的含义)。

func = "nova list | grep Shutdown || true"

代码:

  lines_counter=0
    func="nova list | grep Shutdown || true"
    try:
        data = subprocess.check_output(func, shell=True)
    except Exception:
        data = None
    for line in data():
            lines_counter +=1
    print lines_counter

【讨论】:

以上是关于Python错误:subprocess.CalledProcessError:命令返回非零退出状态1 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python错误和异常

Python错误和异常

python编码错误

python错误类型

python错误捕获练习

python错误处理