-1

我正在尝试使用 python 和 boto 从 Amazon EC2 打印实例和 IP 列表。

我习惯了 PHP 漂亮的多维数组和类似的 JSON 语法,但我在 python 中遇到了很多麻烦。我尝试使用 AutoVivification,如 在 Python 中初始化字典字典的最佳方法是什么?但我没有运气访问其中的对象。

这是我的代码:

import sys
import os
import boto
import string
import urllib2
from pprint import pprint
from inspect import getmembers
from datetime import datetime

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

conn = boto.connect_ec2_endpoint(ec2_url, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
tags = conn.get_all_tags()
myInstances = AutoVivification()

for tag in tags:
    if ( tag.res_type == 'instance' and tag.name == 'Name'):
        if( tag.res_id ):
            myInstances[tag.res_id]['myid'] = tag.res_id
            myInstances[tag.res_id]['name'] = tag.value

addrs = conn.get_all_addresses()
for a in addrs:
    if( a.instance_id ):
      myInstances[a.instance_id]['ip'] = a.public_ip

pprint( myInstances )

for i in myInstances:
    print i.name.rjust(25), i.myid

如果我这样做了,pprint( myInstances )那么我可以看到我创建的多维字典,但我无法访问子数组i.myid- 我收到如下错误:

AttributeError: 'unicode' object has no attribute 'myid'
AttributeError: 'unicode' object has no attribute 'name'

pprint( myInstances)给了我类似的东西:

{u'i-08148364': {'myid': u'i-18243322', 'name': u'nagios', 'ip': u'1.2.3.4'}}

所以我不明白为什么我无法访问这些项目。

4

1 回答 1

3

您的问题只是您尝试访问这些项目的方式:

for i in myInstances:
    # i iterates over the KEYS in myInstances
    print i.name.rjust(25), i.myid

对于 中的每个,这都会尝试myInstances打印i.name.rjust(25)等等。您想要的是访问给定键的(并使用正确的 Python 语法来访问字典元素):

for i in myInstances:
    # i iterates over the KEYS in myInstances
    print myInstances[i]["name"].rjust(25), myInstances[i]["myid"]

或者,如果您根本不需要键,只需首先迭代值:

for i in myInstances.values():
    # i iterates over the VALUES in myInstances
    print i["name"].rjust(25), i["myid"]

或者最后,根据请求,如果您真的想一次迭代键和值:

for k, v in myInstances.iteritems():
    print k, v["name"].rjust(25), v["myid"]
于 2013-04-02T20:08:01.177 回答