🖥️

Macのgcloudコマンドがなぜかpython3.9を参照してしまう問題

2021/03/16に公開

TL;DR

以下でインストールし直すと治るかもしれません。追記参照。

$ brew install google-cloud-sdk

pythonの参照先がおかしい?

Google Cloud SDKは Python3(3.5~3.8 を推奨)と Python2(2.7.9 以降)をサポートしていると書かれています(2021/03現在)
https://cloud.google.com/sdk/docs/install?hl=ja#mac

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

https://cloud.google.com/sdk/gcloud/reference/topic/startup

追記

あとから気がついたのですが、一旦全部アンインストールして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