【发布时间】:2018-08-19 14:25:13
【问题描述】:
大家好,我正在学习 python,目前正在为亚马逊 ec2 做一些作业,boto3 连接到实例并通过 python3 启动 t2 微实例,这是一个给出输出的小代码
import boto3
ec2 = boto3.client('ec2')
# Retrieves all regions/endpoints that work with EC2
response = ec2.describe_regions()
print('Regions:', response['Regions'])
代码取自这里https://boto3.readthedocs.io/en/stable/guide/ec2-example-regions-avail-zones.html这是给我以下输出
Regions:
[
{'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'},
{'Endpoint': 'ec2.eu-west-3.amazonaws.com', 'RegionName': 'eu-west-3'},
{'Endpoint': 'ec2.eu-west-2.amazonaws.com', 'RegionName': 'eu-west-2'},
{'Endpoint': 'ec2.eu-west-1.amazonaws.com', 'RegionName': 'eu-west-1'},
{'Endpoint': 'ec2.ap-northeast-2.amazonaws.com', 'RegionName': 'ap-northeast-2'},
{'Endpoint': 'ec2.ap-northeast-1.amazonaws.com', 'RegionName': 'ap-northeast-1'},
{'Endpoint': 'ec2.sa-east-1.amazonaws.com', 'RegionName': 'sa-east-1'},
{'Endpoint': 'ec2.ca-central-1.amazonaws.com', 'RegionName': 'ca-central-1'},
{'Endpoint': 'ec2.ap-southeast-1.amazonaws.com', 'RegionName': 'ap-southeast-1'},
{'Endpoint': 'ec2.ap-southeast-2.amazonaws.com', 'RegionName': 'ap-southeast-2'},
{'Endpoint': 'ec2.eu-central-1.amazonaws.com', 'RegionName': 'eu-central-1'},
{'Endpoint': 'ec2.us-east-1.amazonaws.com', 'RegionName': 'us-east-1'},
{'Endpoint': 'ec2.us-east-2.amazonaws.com', 'RegionName': 'us-east-2'},
{'Endpoint': 'ec2.us-west-1.amazonaws.com', 'RegionName': 'us-west-1'},
{'Endpoint': 'ec2.us-west-2.amazonaws.com', 'RegionName': 'us-west-2'}
]
我想要做的是一一打印函数 ec2.describe_regions() 返回的字典中的值。
print (response[0],response[1],response[2])
但这给了我密钥错误
describe_regions2.py", line 9, in <module>
print (response[0])
KeyError: 0
如果我做一个
print (response['Endpoint'])
然后我也得到错误
describe_regions2.py", line 9, in <module>
print (response['Endpoint'])
KeyError: 'Endpoint'
>>>
如何获取 ec2.describe_regions() 的单个元素我在这里阅读了文档
https://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Client.describe_regions
当使用print(response) 时,它给出了预期的输出。
在这里,我只想要从字典返回的一些所需元素,而不是所有输出。这是我无法在代码中获得的。
如果我使用
print (response['Regions'][0]['Endpoint'])
我明白了
ec2.ap-south-1.amazonaws.com
如果我使用
print (response['Regions'][0])
我收到{'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'}
我尝试的新代码是
import boto3
ec2 = boto3.client('ec2')
# Retrieves all regions/endpoints that work with EC2
response = ec2.describe_regions()
c=0
#print('Regions:', response['Regions'])
#for i in response:
# print ("i= ",i+" response[i]=",response[i])
# print ("\n")
print ("\nhale luliya\n")
print ("Endpoint="+response['Regions'][0]['Endpoint'])
print ("RegionName="+response['Regions'][0]['RegionName'])
print ("Full response for list[0]"+response['Regions'][0])
最后一个打印语句出错
\describe_regions2.py", line 15, in <module>
print ("Full response for list[0]"+response['Regions'][0])
TypeError: can only concatenate str (not "dict") to str
如何遍历在 for 循环中收到的整个列表作为响应。仅打印所需的值? 我能做到
for key,value in response['Regions'][0].items():
print(key,value)
这给了我
Endpoint ec2.ap-south-1.amazonaws.com
RegionName ap-south-1
问题已解决,更新到这里
这里的复杂性是因为print(type(response['Regions'])) 给出了
<class 'list'> 和 print(type(response['Regions'])) 是 <class 'dict'> 和
print (type(response))
是<class 'dict'>,所以字典也被返回到字典中,一个列表,另一个字典被返回。所以我无法理解。
for data in response['Regions']:
print(data)
for key,value in response['ResponseMetadata'].items():
print(key,value)
帮助我了解返回的内容
{'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'}
{'Endpoint': 'ec2.eu-west-3.amazonaws.com', 'RegionName': 'eu-west-3'}
{'Endpoint': 'ec2.eu-west-2.amazonaws.com', 'RegionName': 'eu-west-2'}
{'Endpoint': 'ec2.eu-west-1.amazonaws.com', 'RegionName': 'eu-west-1'}
{'Endpoint': 'ec2.ap-northeast-2.amazonaws.com', 'RegionName': 'ap-northeast-2'}
{'Endpoint': 'ec2.ap-northeast-1.amazonaws.com', 'RegionName': 'ap-northeast-1'}
{'Endpoint': 'ec2.sa-east-1.amazonaws.com', 'RegionName': 'sa-east-1'}
{'Endpoint': 'ec2.ca-central-1.amazonaws.com', 'RegionName': 'ca-central-1'}
{'Endpoint': 'ec2.ap-southeast-1.amazonaws.com', 'RegionName': 'ap-southeast-1'}
{'Endpoint': 'ec2.ap-southeast-2.amazonaws.com', 'RegionName': 'ap-southeast-2'}
{'Endpoint': 'ec2.eu-central-1.amazonaws.com', 'RegionName': 'eu-central-1'}
{'Endpoint': 'ec2.us-east-1.amazonaws.com', 'RegionName': 'us-east-1'}
{'Endpoint': 'ec2.us-east-2.amazonaws.com', 'RegionName': 'us-east-2'}
{'Endpoint': 'ec2.us-west-1.amazonaws.com', 'RegionName': 'us-west-1'}
{'Endpoint': 'ec2.us-west-2.amazonaws.com', 'RegionName': 'us-west-2'}
RequestId 221d8d0f-908f-4996-8c88-87b00c5da592
HTTPStatusCode 200
HTTPHeaders {'content-type': 'text/xml;charset=UTF-8', 'content-length': '2559', 'vary': 'Accept-Encoding', 'date': 'Sun, 19 Aug 2018 06:20:40 GMT', 'server': 'AmazonEC2'}
RetryAttempts 0
【问题讨论】:
标签: python python-3.x amazon-web-services amazon-ec2 boto3