如何在Python中打破我的外部循环?

时间:2013-12-30 03:50:43

标签: python nested-loops

我正在开发一个项目,我需要使用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

1 个答案:

答案 0 :(得分:5)

在脚本的末尾添加

    else:
        break

循环有一个else子句,如果它退出而没有一个break,则会被调用;因此,如果break中的if...else 被调用,则会调用此方法,即三次失败时。