🖥️
Macのgcloudコマンドがなぜかpython3.9を参照してしまう問題
TL;DR
以下でインストールし直すと治るかもしれません。追記参照。
$ brew install google-cloud-sdk
pythonの参照先がおかしい?
Google Cloud SDKは Python3(3.5~3.8 を推奨)と Python2(2.7.9 以降)をサポートしていると書かれています(2021/03現在)
Mac OS BigSurのデフォルトPythonは2.7です
$ python -V
Python 2.7.16
なので、対応しているはずなのですが、以下のように何故かサポートしていないPython3.9を参照してエラーになることがあります。
$ gcloud
Traceback (most recent call last):
File "/Users/ytkhs/google-cloud-sdk/lib/gcloud.py", line 104, in <module>
main()
File "/Users/ytkhs/google-cloud-sdk/lib/gcloud.py", line 62, in main
from googlecloudsdk.core.util import encoding
File "/Users/ytkhs/google-cloud-sdk/lib/googlecloudsdk/__init__.py", line 23, in <module>
from googlecloudsdk.core.util import importing
File "/Users/ytkhs/google-cloud-sdk/lib/googlecloudsdk/core/util/importing.py", line 23, in <module>
import imp
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/imp.py", line 23, in <module>
from importlib import util
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/importlib/util.py", line 2, in <module>
from . import abc
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/importlib/abc.py", line 17, in <module>
from typing import Protocol, runtime_checkable
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/typing.py", line 26, in <module>
import re as stdlib_re # Avoid confusion with the re we export.
File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/re.py", line 124, in <module>
import enum
File "/Users/ytkhs/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'
これは、homebrewで python@3.9
をインストールしていると先にそちらを使ってしまうことが原因のようです。3.9は他のアプリケーションに依存していたため、消したくありません。そこで python@3.8
をインストールしてみます。
$ brew install python@3.8
:
$ brew list | grep python
python@3.8
python@3.9
この状態でも3.8を自動的に参照してくれるわけではないですが、CLOUDSDK_PYTHON
という環境変数を読んでくれるようなので、以下のようにして解決しました。少し気持ち悪いですが、3.9に対応するまでの辛抱でしょうか。
# Use a python you have installed in a special location
export CLOUDSDK_PYTHON=/usr/local/opt/python@3.8/bin/python3
追記
あとから気がついたのですが、一旦全部アンインストールしてhomebrewのCask経由でインストールすると、pathの問題などいい感じに解決してくれるようです。こちらのほうがおすすめです。
$ brew install google-cloud-sdk
$ which gcloud
/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud
# シェル別に以下を設定
for bash users
source "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc"
source "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc"
for zsh users
source "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc"
source "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc"
for fish users
source "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.fish.inc"
Discussion