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 32
或Fedora 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 -> ../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 true
CLOUDSDK_PYTHON=python3.9 gcloud config config-helper --format=json
AttributeError: module 'importlib' has no attribute 'util'
以上是关于AttributeError:模块“importlib”没有属性“util”的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:模块'asyncio'没有属性'run'
AttributeError:模块'mysql'没有属性'connector'
AttributeError:模块 'urllib' 没有属性 'parse'