我正在开发一个项目,我需要使用Python执行shell脚本。到目前为止,一切看起来都不错。
下面是我的Python脚本,它将执行一个简单的hello world shell脚本。
MAX_TRIES = 2
jsonStr = '{"script":"#!/bin/bash \\n echoo Hello world 1 "}'
j = json.loads(jsonStr)
shell_script = j['script']
steps = ['step1', 'step2', 'step3']
for step in steps:
print "start"
print step
for i in xrange(MAX_TRIES):
proc = subprocess.Popen(shell_script, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
if stderr:
print "Shell script gave some error..."
sleep(0.05) # delay for 50 ms
else:
print "end" # Shell script ran fine.
break
在我上面的脚本中,如果上面的shell脚本由于某种原因而失败并且工作正常,我会重试两次。
现在我的问题是,在上面的脚本中,我有一个错误的shell脚本会失败。我有一个for循环,它将逐个迭代steps
列表并执行shell脚本。
目前,对于每个不是我想要的步骤,它都会像这样打印出来 -
start
step1
Shell script gave some error...
Shell script gave some error...
start
step2
Shell script gave some error...
Shell script gave some error...
start
step3
Shell script gave some error...
Shell script gave some error...
如果shell脚本在第一步失败,那么我不想转到步骤2但是我想为每一步重试两次。假设步骤1的shell脚本执行失败,那么我想为step1重试两次,如果它失败两次,那么我不会去step2但是如果它通过了,那么我只会去step2。
如何以这样的方式打破外部循环以便我能够完成此任务?
更新: -
for step in steps:
print "start"
print step
for i in xrange(MAX_TRIES):
proc = subprocess.Popen(shell_script, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
if stderr:
print "Shell script gave some error..."
print stderr
sleep(0.05) # delay for 50 ms
else:
print stdout
print "end" # Shell script ran fine.
break
else:
break
答案 0 :(得分:5)
在脚本的末尾添加
else:
break
循环有一个else
子句,如果它退出而没有一个break
,则会被调用;因此,如果break
中的if...else
不被调用,则会调用此方法,即三次失败时。