AttributeError:模块“importlib”没有属性“util”

Posted

技术标签:

【中文标题】AttributeError:模块“importlib”没有属性“util”【英文标题】:AttributeError: module 'importlib' has no attribute 'util' 【发布时间】:2021-01-08 14:39:09 【问题描述】:

我刚刚从 Fedora 32 升级到 Fedora 33(Python 3.9 附带)。此后gcloud 命令停止工作:

[guy@Gandalf32 ~]$ gcloud 
Error processing line 3 of /home/guy/.local/lib/python3.9/site-packages/XStatic-1.0.2-py3.9-nspkg.pth:

  Traceback (most recent call last):
    File "/usr/lib64/python3.9/site.py", line 169, in addpackage
      exec(line)
    File "<string>", line 1, in <module>
    File "<frozen importlib._bootstrap>", line 562, in module_from_spec
  AttributeError: 'NoneType' object has no attribute 'loader'

Remainder of file ignored
Traceback (most recent call last):
  File "/usr/lib64/google-cloud-sdk/lib/gcloud.py", line 104, in <module>
    main()
  File "/usr/lib64/google-cloud-sdk/lib/gcloud.py", line 62, in main
    from googlecloudsdk.core.util import encoding
  File "/usr/lib64/google-cloud-sdk/lib/googlecloudsdk/__init__.py", line 23, in <module>
    from googlecloudsdk.core.util import importing
  File "/usr/lib64/google-cloud-sdk/lib/googlecloudsdk/core/util/importing.py", line 23, in <module>
    import imp
  File "/usr/lib64/python3.9/imp.py", line 23, in <module>
    from importlib import util
  File "/usr/lib64/python3.9/importlib/util.py", line 2, in <module>
    from . import abc
  File "/usr/lib64/python3.9/importlib/abc.py", line 17, in <module>
    from typing import Protocol, runtime_checkable
  File "/usr/lib64/python3.9/typing.py", line 26, in <module>
    import re as stdlib_re  # Avoid confusion with the re we export.
  File "/usr/lib64/python3.9/re.py", line 124, in <module>
    import enum
  File "/usr/lib64/google-cloud-sdk/lib/third_party/enum/__init__.py", line 26, in <module>
    spec = importlib.util.find_spec('enum')
AttributeError: module 'importlib' has no attribute 'util'

【问题讨论】:

【参考方案1】:

GCP 支持更新

GCP support mentioned表示新版本318.0.0发布于2020.11.10 应该支持python 3.9

我将我的 gcloud sdk 更新为 318.0.0,现在看起来支持 python 3.9.0。

要解决这个问题,运行

gcloud components update

Fedora 33 包含 python 2.7 并强制 GCloud SDK 使用它请设置此环境变量

export CLOUDSDK_PYTHON=python2

您可以将此导出命令添加到您的~/.bash_profile

Python 3.9 非常新,预计 Gcloud SDK 不支持 3.9,它被编写为兼容 2.7.x & 3.6 - 3.8(3.8 会导致一些兼容性问题我建议使用 3.7)

作为一种解决方法,将 Python 3.8 或 3.7(这些版本适用于 Gcloud 和大多数 linux 发行版)配置为系统范围的解释器并尝试使用 gcloud 命令。

【讨论】:

有点奇怪python38 不适用于Fedora 32Fedora 33。但是python37 似乎两者都可以使用。 Python38 现在也可以在 fedora 上使用。 啊,Fedora 32 上的默认python 是指向python3 的链接,当前为python v 3.8 我在上游提交了一个错误:issuetracker.google.com/issues/172647331 对于 Debian 或其他具有多个 python 版本的发行版:CLOUDSDK_PYTHON=python3.8 gcloud components update【参考方案2】:

对于 macOS/Homebrew:

brew install python@3.8
export CLOUDSDK_PYTHON=python3.8
ln -s /usr/local/Cellar/python@3.8/*/bin/python3.8 /usr/local/bin/python3.8

gcloud components update

# the issue is now resolved and you can return to python 3.9
unset CLOUDSDK_PYTHON

【讨论】:

我还必须在 /usr/local/bin 中创建指向 python 3.8 的符号链接:/usr/local/bin/python3.8 -&gt; ../Cellar/python@3.8/3.8.6_2/bin/python3.8 我只有 python@3.9,所以我必须像上面那样安装 3.8,然后像 @Raphaël 推荐的那样链接它 brew unlink python@3.9 然后 brew link python@3.8 就个人而言,我不想在其他任何地方停止使用 python@3.9;对于 gcloud CLI,我只想冻结到 3.8。 感谢@RaphaëlLemaire 我现在在解决方案中添加了一行。 你也可以只做CLOUDSDK_PYTHON=python2 gcloud components update【参考方案3】:

对于 Mac 操作系统用户

首先你应该运行brew update

如果您遇到此错误:

Error: homebrew-core is a shallow clone. To `brew update` first run:
  git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow
This restriction has been made on GitHub's request because updating shallow
clones is an extremely expensive operation due to the tree layout and traffic of
Homebrew/homebrew-core. We don't do this for you automatically to avoid
repeatedly performing an expensive unshallow operation in CI systems (which
should instead be fixed to not use shallow clones). Sorry for the inconvenience!

运行下一条命令:

git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow
git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask" fetch --unshallow

现在,

更新python 3.8 brew upgrade python@3.8

将 python 3.8 添加到 PATH export PATH="/usr/local/opt/python@3.8/bin:$PATH"

在 Cloud SDK 中使用 python 3.8 export CLOUDSDK_PYTHON=python3.8

现在,您可以更新 gcloud 组件gcloud components update

【讨论】:

这行得通,即使我有 python 3.9,我也必须使用 3.8 运行上述命令【参考方案4】:

在 brew 升级后发生在我身上。适用于 python 3.8。

你需要将 python3.8 加入你的 shell 路径。我执行了以下几行,它起作用了

export PATH="/usr/local/opt/python@3.8/bin:$PATH"
alias python=/usr/local/opt/python@3.8/bin/python3

谢谢!

【讨论】:

谢谢,当上面的答案没有时,这对我在 OSX 上有效。【参考方案5】:

如果您不想使用 Python 2,可以在 Fedora 33 上使用 Python 3.8,直到 SDK 开始支持 Python 3.9。

使用以下命令安装 python 3.8:

sudo dnf install python3.8

您可以通过运行来验证您的安装:

python3.8 --version

然后将其设置为 Google Cloud SDK 解释器:

export CLOUDSDK_PYTHON=python3.8

之后SDK应该可以正常工作了。

【讨论】:

Python 3.8 与 Gcloud SDK 存在一些问题,请使用 3.7 或 2.7 这些版本与 Gcloud SDK 更兼容【参考方案6】:

gcloud 将于 11 月 10 日更新至版本 318,并将修复此问题。

【讨论】:

禁用报告并没有解决我的问题:gcloud config set disable_usage_reporting trueCLOUDSDK_PYTHON=python3.9 gcloud config config-helper --format=jsonAttributeError: module 'importlib' has no attribute 'util'

以上是关于AttributeError:模块“importlib”没有属性“util”的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:模块'asyncio'没有属性'run'

AttributeError:模块'mysql'没有属性'connector'

AttributeError:“模块”对象没有属性“作者”

AttributeError:模块 'urllib' 没有属性 'parse'

AttributeError:模块“cupy”没有属性“cupyx”

AttributeError:“模块”对象没有属性