MacのPythonのバージョン競合

Mac環境にて、公式インストーラからインストールしたPython3とbrewでインストールしたPython3が混在し、brew側を優先するように設定しました。

目次

はじめに

brewでPython3.9.9を導入したはずなのに、コマンドラインからバージョンを確認すると、以下のようになっていました。

takamotokeiji@Savoie ~ % python3 -V
Python 3.9.0

これをbrewでインストールした3.9.9に変更しようと思います。

環境は以下となります。

  • PC:MacBook Pro 2020 Intel
  • OS:MacOS Big Sur バージョン11.6
  • Python:公式インストーラ版3.9.0、brew版3.9.9

調査

python3の実体を確認すると以下のようになっていました。

takamotokeiji@Savoie ~ % which python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3

/Library/Frameworks/Python.framework/は、Pythonの公式インストーラが管理しているディレクトリです。

次に、brewのインストール状態を確認すると、以下のように3.9.9となっておりインストール先ディレクトリは/usr/local/Cellar/python@3.9/3.9.9です。

takamotokeiji@Savoie ~ % brew info python
python@3.9: stable 3.9.9 (bottled)
Interpreted, interactive, object-oriented programming language
/usr/local/Cellar/python@3.9/3.9.9 (3,080 files, 55.0MB)
  Poured from bottle on 2021-12-30 at 21:08:55
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/python@3.9.rb
License: Python-2.0
==> Dependencies
Build: pkg-config ✔
Required: gdbm ✔, mpdecimal ✔, openssl@1.1 ✔, readline ✔, sqlite ✔, xz ✔
==> Caveats
Python has been installed as
  /usr/local/bin/python3

Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
  /usr/local/opt/python@3.9/libexec/bin

You can install Python packages with
  pip3 install <package>
They will install into the site-package directory
  /usr/local/lib/python3.9/site-packages

tkinter is no longer included with this formula, but it is available separately:
  brew install python-tk@3.9

See: https://docs.brew.sh/Homebrew-and-Python
==> Analytics
install: 526,422 (30 days), 2,191,952 (90 days), 8,321,107 (365 days)
install-on-request: 271,712 (30 days), 992,940 (90 days), 3,119,798 (365 days)
build-error: 396 (30 days)

Python公式インストーラにてインストール後、brewでPythonをインストールするとこのような状態になってしまうと思います。

もう少し調査

~/.zprofileを確認すると、最後の2行で公式インストーラ用のパスが張られています。(最初の2行にはPython3.8による操作の痕跡が残っています。)

# Setting PATH for Python 3.8
# The original version is saved in .zprofile.pysave
PATH="$HOME/products/oracle/instantclient_12_2:usr/local/Cellar/libpq/13.0_1/bin:/Library/Frameworks/GDAL.framework/Versions/3.1/Programs$:${PATH}"
#ORACLE_HOME="$HOME/products/oracle/instantclient_12_2"
ORACLE_HOME="$HOME/products/oracle"
NLS_LANG="Japanese_Japan.UTF8"
#NLS_LANG="Japanese_Japan.JA16SJIS"
export PATH
export ORACLE_HOME
export NLS_LANG

# Setting PATH for Python 3.9
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.9/bin:${PATH}"
export PATH

まずはこのPATH設定をコメントアウトします。

# PATH="/Library/Frameworks/Python.framework/Versions/3.9/bin:${PATH}"
# export PATH

しかし、まだ公式インストーラのPythonが有効です。。

takamotokeiji@Savoie ~ % source .zprofile
takamotokeiji@Savoie ~ % python3 -V
Python 3.9.0
takamotokeiji@Savoie ~ % which python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3

これは、/usr/local/bin/python3(シンボリックリンク)が、公式インストーラ側を指しているためです。

brewで新しいバージョンをインストールしても、旧バージョンをbrew以外でインストールしている場合はシンボリックリンクを書き換えてくれないようです。

以下のようになっています。

takamotokeiji@Savoie bin % pwd
/usr/local/bin
takamotokeiji@Savoie bin % ls -ld py*
lrwxr-xr-x  1 root           wheel  68 11  4  2020 pydoc3 -> ../../../Library/Frameworks/Python.framework/Versions/3.9/bin/pydoc3
lrwxr-xr-x  1 root           wheel  70  5 28  2020 pydoc3.8 -> ../../../Library/Frameworks/Python.framework/Versions/3.8/bin/pydoc3.8
lrwxr-xr-x  1 root           wheel  70 11  4  2020 pydoc3.9 -> ../../../Library/Frameworks/Python.framework/Versions/3.9/bin/pydoc3.9
lrwxr-xr-x  1 root           wheel  69 11  4  2020 python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.9/bin/python3
lrwxr-xr-x  1 root           wheel  76 11  4  2020 python3-config -> ../../../Library/Frameworks/Python.framework/Versions/3.9/bin/python3-config
lrwxr-xr-x  1 root           wheel  71  5 28  2020 python3.8 -> ../../../Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8
lrwxr-xr-x  1 root           wheel  78  5 28  2020 python3.8-config -> ../../../Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8-config
lrwxr-xr-x  1 root           wheel  71 11  4  2020 python3.9 -> ../../../Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9
lrwxr-xr-x  1 root           wheel  78 11  4  2020 python3.9-config -> ../../../Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9-config

このあたりのシンボリックリンクを書き換えればよさそうです。

brewでインストールした物件(/usr/local/Cellar/python@3.9/3.9.9/bin)も確認しておきます。

takamotokeiji@Savoie bin % pwd
/usr/local/Cellar/python@3.9/3.9.9/bin
takamotokeiji@Savoie bin % ls -l
total 24
lrwxr-xr-x  1 takamotokeiji  staff   52 11 16 03:05 2to3 -> ../Frameworks/Python.framework/Versions/3.9/bin/2to3
lrwxr-xr-x  1 takamotokeiji  staff   56 11 16 03:05 2to3-3.9 -> ../Frameworks/Python.framework/Versions/3.9/bin/2to3-3.9
lrwxr-xr-x  1 takamotokeiji  staff   53 11 16 03:05 idle3 -> ../Frameworks/Python.framework/Versions/3.9/bin/idle3
lrwxr-xr-x  1 takamotokeiji  staff   55 11 16 03:05 idle3.9 -> ../Frameworks/Python.framework/Versions/3.9/bin/idle3.9
-rwxr-xr-x  1 takamotokeiji  wheel  244 12 30 21:09 pip3
-rwxr-xr-x  1 takamotokeiji  wheel  244 12 30 21:09 pip3.9
lrwxr-xr-x  1 takamotokeiji  staff   54 11 16 03:05 pydoc3 -> ../Frameworks/Python.framework/Versions/3.9/bin/pydoc3
lrwxr-xr-x  1 takamotokeiji  staff   56 11 16 03:05 pydoc3.9 -> ../Frameworks/Python.framework/Versions/3.9/bin/pydoc3.9
lrwxr-xr-x  1 takamotokeiji  staff   55 11 16 03:05 python3 -> ../Frameworks/Python.framework/Versions/3.9/bin/python3
lrwxr-xr-x  1 takamotokeiji  staff   62 11 16 03:05 python3-config -> ../Frameworks/Python.framework/Versions/3.9/bin/python3-config
lrwxr-xr-x  1 takamotokeiji  staff   57 11 16 03:05 python3.9 -> ../Frameworks/Python.framework/Versions/3.9/bin/python3.9
lrwxr-xr-x  1 takamotokeiji  staff   64 11 16 03:05 python3.9-config -> ../Frameworks/Python.framework/Versions/3.9/bin/python3.9-config
-rwxr-xr-x  1 takamotokeiji  wheel  231 12 30 21:09 wheel3

実体は、/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/binに存在していることがわかります。

処置

原因がわかったところで処置です。

/usr/local/binの下のPython3関係のシンボリックリンクを書き換えます。
なぜか、pip3だけはbrewでインストールした物件にリンクが張られてたいたので、以下のようにコマンドを実行します。

takamotokeiji@Savoie bin % pwd
/usr/local/bin
takamotokeiji@Savoie bin % ln -nfs ../Cellar/python@3.9/3.9.9/bin/2to3 2to3
takamotokeiji@Savoie bin % ln -nfs ../Cellar/python@3.9/3.9.9/bin/idle3 idle3
takamotokeiji@Savoie bin % ln -nfs ../Cellar/python@3.9/3.9.9/bin/pydoc3 pydoc3
takamotokeiji@Savoie bin % ln -nfs ../Cellar/python@3.9/3.9.9/bin/python3 python3
takamotokeiji@Savoie bin % ln -nfs ../Cellar/python@3.9/3.9.9/bin/python3-config python3-config

これでようやくbrewでインストールした物件を使えるようになりました。

takamotokeiji@Savoie bin % python3 -V
Python 3.9.9

まとめ

今回は、調査に少々時間がかかりました。

Pythonを公式インストーラとbrewの両方でインストールしたことが失敗だったようです。

なお、公式物件のアンインストールは、ファイル削除など面倒そうなので、今回はPATHの修正とリンク先の変更に留めています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次