【问题标题】:ImportError: cannot import name 'Iterable' from 'collections' in PythonImportError:无法在 Python 中从 \'collections\' 导入名称 \'Iterable\'
【发布时间】:2022-08-04 00:04:22
【问题描述】:

在 Mac 上使用 Atom 使用 Python。 代码:

from rubik.cube import Cube
from rubik_solver import utils

完整错误:

Traceback (most recent call last):
  File \"/Users/Audey/Desktop/solver.py\", line 2, in <module>
    from rubik_solver import utils
  File \"/Users/Audey/Library/Python/3.10/lib/python/site-packages/rubik_solver/utils.py\", line 4, in <module>
    from past.builtins import basestring
  File \"/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/builtins/__init__.py\", line 43, in <module>
    from past.builtins.noniterators import (filter, map, range, reduce, zip)
  File \"/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/builtins/noniterators.py\", line 24, in <module>
    from past.types import basestring
  File \"/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/types/__init__.py\", line 25, in <module>
    from .oldstr import oldstr
  File \"/Users/Audey/Library/Python/3.10/lib/python/site-packages/past/types/oldstr.py\", line 5, in <module>
    from collections import Iterable
ImportError: cannot import name \'Iterable\' from \'collections\' (/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/collections/__init__.py)

from rubik_solver import utils 是导致错误的原因,因为当我删除它时,错误不会出现。我不确定是什么导致了错误,并检查了那里的代码并在其他来源上找到了它,所以我确信它应该工作。 有什么解决办法吗?

  • 搜索此错误时,似乎 Python 3.10 存在导致此错误出现的兼容性问题;我看到它建议您同时安装和使用 Python 3.9。这能解决吗?我假设你已经查找了错误并尝试了一些东西,但是你没有提到任何关于这样做的事情。
  • 是的会尝试。查了一下,但没有找到这个:)

标签: python python-module


【解决方案1】:

在 Python 3.10 中,Iterable 抽象类已从 collections 中删除。请参阅 3.9 collections docs 中的弃用说明。在 3.10 文档的 Removed 部分中,项目

是什么导致你的错误。

您可以改用 collections.abc 中的 Iterable,如果问题出在无法更新的依赖项中,则使用 Python 3.9。

【讨论】:

    【解决方案2】:

    正如在其他答案中所说,问题是从 python 3.10 将一些别名从 collections.abc 弃用为 collections

    如果由于第三方导入而无法修改脚本中的导入,作为临时解决方法,您可以在导入有问题的第三方库之前手动执行别名。例如,请参阅下面的示例以导入 hyper 库,这会导致与您的问题类似的问题。

    import collections.abc
    #hyper needs the four following aliases to be done manually.
    collections.Iterable = collections.abc.Iterable
    collections.Mapping = collections.abc.Mapping
    collections.MutableSet = collections.abc.MutableSet
    collections.MutableMapping = collections.abc.MutableMapping
    #Now import hyper
    import hyper
    

    【讨论】:

      【解决方案3】:

      在 python 版本 3.10 中,您应该从 collections.abc 导入 Iterable 代替:

      from collections.abc import Iterable
      

      或者您可以:

      try:
          from collections.abc import Iterable
      except ImportError:
          from collections import Iterable
      

      【讨论】:

        猜你喜欢
        • 2022-08-21
        • 2022-11-10
        • 2022-12-20
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2020-11-17
        • 1970-01-01
        • 2016-09-06
        相关资源
        最近更新 更多