我正在尝试使用 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'}}
所以我不明白为什么我无法访问这些项目。