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の修正とリンク先の変更に留めています。
コメント