2012-01-31 2 views
0

MISE À JOUR:Boto exemple .__ dict __ [ 'tags'] [ 'nom'] d'émission de sortie


Je l'ai fait ce qui est suggéré ci-dessous, cependant, je recevais toujours un KeyError: 'Nom' dans la sortie, même si la sortie était correcte.

Ce fut la sortie:

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' 

Question initiale:

Je suis en train de vider une liste de ID d'instance ainsi que leur étiquette "Nom" de AWS utilisant boto. J'ai trouvé en ligne une méthode que l'on peut attacher à l'objet instance, appelée __dict__, qui semblait bien fonctionner, cependant, je voulais sortir la balise "name" seulement en utilisant cette méthode, mais je continue d'obtenir une erreur "Key Error : 'Nom' "

Fondamentalement, ce code fonctionne:

# 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']) 

la sortie est hoky tho:

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'} 

Quand je fais un changement à la méthode __dict__ à "tirer" out" name "seulement, cela fonctionne (ou semble fonctionner, mais génère une erreur:

Voici le changement de code:

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

est ici la sortie:

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' 

Je préfère cette sortie, SANS l'erreur - quelqu'un peut me dire ce que je fais mal ici?

Merci

Répondre

4

Pourquoi ne pas simplement accéder aux balises d'attributs directement? Apprendre à via __dict__ est pas très pythonique:

instance.tags['Name'] 

Vous pouvez également regarder l'état de l'instance depuis certains des cas dans les objets de réservation que vous revenez de get_all_instances() peut être récemment terminé instances. Vous pouvez signaler le nom uniquement sur les instances de fonctionnement et l'état autrement (NOTE - ce contrôle de .state est juste une idée de montrer la vous syntaxe A if cond else B aurez toujours à jouer avec vous-même.):

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

Vous pouvez utiliser dict.get() si tout ce que vous voulez faire est d'éviter KeyError et de retourner une valeur par défaut.

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

Voici un texte de présentation tiré de la boto ec2 tutorial qui mentionne des objets de réservation et de l'état d'instance.

If you just want to get a list of all of your running instances, use the get_all_instances method of the connection object. Note that the list returned is actually a list of Reservation objects (which contain the Instances) and that the list may include recently terminated instances for a small period of time subsequent to their termination.

+0

Merci pour la réponse, vraiment apprécier. Cependant, lorsque j'utilise votre syntaxe, je reçois toujours le "KeyError" lors de l'exécution du code mis à jour: –

+0

'us-west-1 EC2Connection: ec2.us-west-1.amazonaws.com Affichage de tout votre courant instances \t Proxy-44-1000 enrôle \t Proxy-45-1000 enrôle \t Proxy-48-1000 enrôle \t Proxy-49-1000 enrôle \t Proxy-59-1000 enrôle \t proxy- 67-1000-Inscriptions \t Proxy-70-1000-Enrollments \t Proxy-71-1000-Enrollments \t Proxy-73-1000 enrôle retraçage (le plus récent appel dernier): Fichier "/Users/xxxxx/xxxx/boto/instanceid.py", ligne 43, en print "\ t% s" % (par exemple .tags ['Name']) si instance.state == 'running' else instance.state KeyError: 'Nom' –

Questions connexes