【问题标题】:Where can I find an overview of how the ec2.instancesCollection is built在哪里可以找到有关如何构建 ec2.instancesCollection 的概述
【发布时间】:2016-02-17 09:10:19
【问题描述】:

在boto3中有一个函数:

    ec2.instances.filter()

文档: http://boto3.readthedocs.org/en/latest/reference/services/ec2.html#instance

说它返回一个列表(ec2.Instance)我希望......

当我尝试打印退货时,我得到了这个:

    ec2.instancesCollection(ec2.ServiceResource(), ec2.Instance)

我尝试搜索任何提及 ec2.instanceCollection 的内容,但我发现的唯一内容是与 ruby​​ 类似的内容。

我想遍历这个 instanceCollection,这样我就可以看到它有多大,存在哪些机器等等。 问题是我不知道它是如何工作的,当它为空迭代时根本不起作用(它会引发错误)

【问题讨论】:

    标签: python-3.x amazon-ec2 boto3


    【解决方案1】:

    filter 方法不返回一个列表,它返回一个可迭代对象。这基本上是一个 Python 生成器,可以高效地按需生成所需的结果。

    你可以像这样在循环中使用这个迭代器:

    for instance in ec2.instances.filter():
        # do something with instance
    

    或者如果你真的想要一个列表,你可以将迭代器变成一个列表:

    instances = list(ec2.instances.filter())
    

    【讨论】:

    • 您没有阅读我的问题。根据编译器或它返回的任何东西 ec2.instancesCollection(ec2.ServiceResource(), ec2.Instance) 我提到它是一个列表的原因是因为 boto3 的文档说它返回一个列表。
    • 另外,当返回为空时,将其转换为列表会给我同样的问题。填充后对其进行迭代可以正常工作。
    【解决方案2】:

    我之所以添加这个答案,是因为 5 年后我遇到了同样的问题,并转圈试图找到答案。

    首先,文档中的返回类型是错误的(仍然)。正如你所说,它声明返回类型是:
    list(ec2.Instance)
    应该在哪里:
    ec2.instancesCollection.
    在撰写本文时,github 中有一个未解决的问题涉及此问题 - https://github.com/boto/boto3/issues/2000

    当您调用过滤器方法时,会为您调用该方法所针对的特定资源类型创建ResourceCollection。在这种情况下,资源类型是instance,它给出了instancesCollection。您可以在此处查看 instancesCollectionResourceCollection 超类的代码: https://github.com/boto/boto3/blob/develop/boto3/resources/collection.py

    此处的文档概述了这些集合:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/collections.html

    为了了解如何使用它并实际回答您的问题,我所做的是将迭代器转换为列表并在大小大于 0 时遍历列表。

    testList = list(ec2.instances.filter(Filters=filters))
    
    if len(testList) > 0;
      for item in testList;
    .
    .
    .
    

    这可能不是最好的方法,但它对我有用。

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2011-11-28
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2019-04-27
      • 2019-12-16
      相关资源
      最近更新 更多