while循环陷入同样的​​困境

时间:2016-07-05 04:37:22

标签: python boto3

我有一个代码创建一个快照,然后检查它是否完成,我写了下面的代码,但由于某种原因它没有更新state变量而while循环继续打印相同的东西即使快照已经completed

以下是代码:

 def call_creater():
    regions = ['eu-central-1']
    for region in regions:
        ec2 = boto3.resource('ec2', region, aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, )
        snapshot = ec2.create_snapshot(VolumeId='vol-f9e7d220', Description='fra01-he-trial-ansible01')
        while snapshot.state != 'completed':
            print snapshot.state
            print "Snapshot under creation"
            time.sleep(10)
        else:
            print "snapshot READY"

输出:

 pending
Snapshot under creation
pending
Snapshot under creation
pending
Snapshot under creation
pending
Snapshot under creation

即使快照完成,这也会继续打印"Snapshot under creation"。原因是,我无法更新我的状态variable我相信,请帮我解释一下?

2 个答案:

答案 0 :(得分:1)

snapshot = ec2.create_snapshot(VolumeId='vol-f9e7d220', Description='fra01-he-trial-ansible01')

此行仅执行一次,在该实例中,state为" pending"。你必须在循环中再次检查snapshot变量的状态。

您没有在代码或snapshot循环中的任何位置更新while变量。

你必须在while循环中做这样的事情。

snapshot = conn.get_all_snapshots(snapshot_ids=[<YOUR SNAPSHOT ID>])[0]

检查boto库以及如何获取带有id的快照状态。

答案 1 :(得分:1)

正如Pratik所说,你的陈述只执行一次而且从不更新。您可以使用.load()更新资源。但更好的是,我建议您使用waiter。这将为您处理所有等待逻辑,并在快照完成时返回。对于该资源,您可以使用:snapshot.wait_until_completed()