boto instance .__ dict __ ['tags'] ['Name']输出问题

时间:2012-01-31 19:32:46

标签: python amazon-ec2 amazon-web-services instance boto

更新


我做了下面建议的事情,但是,我仍然在输出中得到一个KeyError:'Name',即使输出是正确的。

这是输出:

us-west-1 EC2Connection:
ec2.us-west-1.amazonaws.com 
Showing all of your current instances 
Proxy-44-1000-Enrollments 
Proxy-45-1000-Enrollments 
Proxy-48-1000-Enrollments 
Proxy-49-1000-Enrollments 
Proxy-59-1000-Enrollments 
Proxy-67-1000-Enrollments 

Traceback (most recent call last): File "/Users/xxxxx/xxxx/boto/instanceid.py", 
line 43, in <module> print "\t%s" % (instance.tags['Name']) if instance.state ==
'running' else instance.state KeyError: 'Name'

初步问题:

我正在尝试使用boto从AWS转出实例ID列表及其“Name”标记。我在网上发现了一个可以附加到实例对象的方法,称为__dict__,它似乎运行良好,但是,我只想在使用这种方法时拔出“name”标签,但我一直在错误“键错误:'名称'”

基本上,此代码有效:

# Creating connection object to EC2
conn = boto.connect_ec2()

regions = boto.ec2.regions()

# the 5 element in the array is "us-west-1" and setting the object to connect
us = regions[5]
print us.name
conn_us = us.connect()
print conn_us

filters = {'key-name' : 'misc-key'}

all_inst = conn_us.get_all_instances(filters=filters)

print "Showing all of your current instances" 
for res in all_inst: 
    # each reservation have a instance: 
    for instance in res.instances: 
        print "\t%s: \t%s" % (instance.id, instance.__dict__['tags'])

输出很糟糕:

us-west-1
EC2Connection:ec2.us-west-1.amazonaws.com
Showing all of your current instances
    i-xxxxxxxx:     {u'Name': u'Proxy-xx-1000-Enrollments'}
    i-xxxxxxxx:     {u'Name': u'Proxy-xx-1000-Enrollments'}
    i-xxxxxxxx:     {u'Name': u'Proxy-xx-1000-Enrollments'}
    i-xxxxxxxx:     {u'Name': u'Proxy-xx-1000-Enrollments'}
    i-xxxxxxxx:     {u'Name': u'Proxy-xx-1000-Enrollments'}

当我对__dict__方法进行更改以“拉出”“名称”时,它可以正常工作(或似乎有效,但会引发错误:

以下是代码更改:

print "\t%s: \t%s" % (instance.id, instance.__dict__['tags']['Name'])

这是输出:

us-west-1
EC2Connection:ec2.us-west-1.amazonaws.com
Showing all of your current instances
    i-xxxxxxxx:     Proxy-xx-1000-Enrollments
    i-xxxxxxxx:     Proxy-xx-1000-Enrollments
    i-xxxxxxxx:     Proxy-xx-1000-Enrollments
    i-xxxxxxxx:     Proxy-xx-1000-Enrollments
    i-xxxxxxxx:     Proxy-xx-1000-Enrollments
    i-xxxxxxxx:     Proxy-xx-1000-Enrollments

Traceback (most recent call last):
  File "/Users/xxxxxx/xxx.xxx/boto/instanceid.py", line 43, in <module>
    print "\t%s: \t%s" % (instance.id, instance.__dict__['tags']["Name"])
KeyError: 'Name'

我更喜欢这个输出,没有错误 - 有谁能告诉我这里我做错了什么?

由于

1 个答案:

答案 0 :(得分:4)

为什么不直接访问tags属性?通过__dict__获取它并不是非常pythonic:

instance.tags['Name']

您还可能希望查看实例的状态,因为您从get_all_instances()返回的Reservation对象中的某些实例可能是最近终止的实例。您可以仅在正在运行的实例上报告名称,否则报告状态(注意 - 此.state检查只是一个显示A if cond else B语法的想法。您仍然必须自己玩它):

instance.tags['Name'] if instance.state == 'running' else instance.state

如果您只想避免KeyError并返回默认值,则可以使用dict.get()

instance.tags.get('Name')  
# or with a default
instance.tags.get('Name', '--')

这是从提到保留对象和实例状态的boto ec2 tutorial中提取的模糊。

  

如果您只想获取所有正在运行的实例的列表,请使用   连接对象的get_all_instances方法。请注意   返回的列表实际上是一个Reservation对象列表(包含   实例),该列表可能包括最近终止   在终止后的一小段时间内的实例。