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

Guy*_*min 79 python fedora gcloud python-3.9

我刚刚从 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'
Run Code Online (Sandbox Code Playgroud)

Jan*_*dez 111

来自 GCP 支持的更新

GCP支持提到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
Run Code Online (Sandbox Code Playgroud)

您可以将此导出命令添加到您的 ~/.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 上使用。 (3认同)

Dr *_*Nic 87

对于 macOS/自制软件:

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
Run Code Online (Sandbox Code Playgroud)

  • 您也可以只执行“CLOUDSDK_PYTHON=python2 gcloud 组件更新” (10认同)
  • 我只有 python@3.9,所以我必须如上所述安装 3.8,然后像 @Raphaël 推荐的 `brew unlink python@3.9` 然后 `brew link python@3.8` 一样链接它 (4认同)
  • 我还必须在 `/usr/local/bin` 中创建一个到 python 3.8 的符号链接:`/usr/local/bin/python3.8 -&gt; ../Cellar/python@3.8/3.8.6_2/bin/python3 .8` (3认同)

小智 17

对于 Mac OS 用户

首先你应该运行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!
Run Code Online (Sandbox Code Playgroud)

运行下一个命令:

git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow
git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask" fetch --unshallow
Run Code Online (Sandbox Code Playgroud)

现在,

更新蟒蛇 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


Shi*_*hir 13

在 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
Run Code Online (Sandbox Code Playgroud)

谢谢!


小智 6

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

使用以下命令安装 python 3.8:

sudo dnf install python3.8
Run Code Online (Sandbox Code Playgroud)

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

python3.8 --version
Run Code Online (Sandbox Code Playgroud)

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

export CLOUDSDK_PYTHON=python3.8
Run Code Online (Sandbox Code Playgroud)

在此之后,SDK 应该可以正常工作。