我需要在python脚本中计算shell命令输出的行数。
如果有输出,此功能可正常工作,但如果输出为空,则会出现错误输出中所述的错误。
我试图避免使用if
语句,以防命令输出为None
,但这没有帮助。
#!/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
答案 0 :(得分:3)
您正在运行的grep
命令退出时退出状态为1
,如果它与任何内容都不匹配。该非零退出代码会导致check_output
引发异常(这就是其名称的“检查”部分的含义)。
如果您不希望失败的匹配引发异常,请考虑使用subprocess.getoutput
而不是check_output
。或者您可以更改命令以避免非零退出代码:
func = "nova list | grep Shutdown || true"
答案 1 :(得分:0)
您可以通过try-except块包围subprocess
调用:
try:
data = subprocess.check_output(func, shell=True)
except Exception:
data = None
另外,写if data:
would be better而不是if data is True:
。
答案 2 :(得分:0)
这就是它的工作原理 如第一个解决方案中所述: 如果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