macOS の Python事情を理解する

macOSでPythonを使おうとする時、様々な選択肢があります。

  • Apple純正のPython
  • HomebrewのPython
  • AnacondaのPython
  • Python.orgのPython

まず、それぞれのインストール方法とそのPythonのパスを明確にします。バージョンは2024年1月現在のものになります。

Apple純正のPython

  • インストール
    Apple純正のPythonは xcode-select でインストールされます

    xcode-select --install
    
  • パス

    Apple純正のPythonのパスは /usr/bin/python3 です

    私の環境 (macOS 13.6.3) では以下のようになりました

    $ /usr/bin/python3
    Python 3.9.6 (default, Sep 26 2022, 11:37:49)
    [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
    

HomebrewのPython

  • インストール
    HomebrewのPythonは brew install でインストールされます

    brew install python3
    
  • パス
    HomebrewのPythonのパスは /usr/local/Cellar/python@3.11/3.11.7_1/bin/python3 であり、シンボリックリンクが /usr/local/bin/python3 に貼られます。後述しますが、python.org本家も同じところに作ってくるのでコンフリクトが起こります

    $ /usr/local/Cellar/python\@3.11/3.11.7_1/bin/python3
    Python 3.11.7 (main, Dec  4 2023, 18:10:11) 
    [Clang 15.0.0 (clang-1500.1.0.2.5)] on darwin
    

AnacondaのPython

  • インストール
    Anacondaは、公式サイト(https://www.anaconda.com/download)でインストーラーをダウンロードし、インストールします

  • パス
    Anacondaは、ユーザーディレクトリの下のanaconda3にインストールされます

    $ /Users/ユーザー名/anaconda3/bin/python3
    Python 3.11.5 (main, Sep 11 2023, 08:19:27) 
    [Clang 14.0.6 ] on darwin
    

    なお、別のポストで書きますが、Anacondaはインストールすると、このバージョンのPythonを使うように設定されます。その際は、ターミナルの前に (base) とつきます

Python.orgのPython

  • インストール
    Python本家のPythonは、公式サイト(https://www.python.org/)からインストーラーをダウンロードし、ダウンロードします

  • パス
    Python本家のPythonのパスは、/Library/Frameworks/Python.framework/Versions/3.12/bin/python3 になります

    /Library/Frameworks/Python.framework/Versions/3.12/bin/python3
    Python 3.12.1 (v3.12.1:2305ca5144, Dec  7 2023, 17:23:39) 
    [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
    

    そして、/usr/local/bin/python3 にシンボリックリンクがはられます

そのほか、脳画像解析で FSL や FreeSurfer を使っている方は、以下に python3 が入っています

FSLのPython

  • パス
    FSLのPythonはバージョン 6.0.6 以降では、/usr/local/fsl/bin/python3 となります。

    $ /usr/local/fsl/bin/python3
    Python 3.11.6 | packaged by conda-forge | 
    (main, Oct  3 2023, 10:40:37) [Clang 15.0.7 ] on darwin
    

FreeSurferのPython

  • パス

    FreeSurferのPythonは、/usr/local/freesurfer/7.4.1/ となります。

    $ /usr/local/freesurfer/7.4.1/python/bin/python3
    Python 3.8.13 (default, Apr 21 2022, 12:55:06)
    [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
    

自分がどのPythonを使っているのか

自分がどのPythonを使っているのかを意識することは大事です。なぜならば、様々なモジュールは今、自分が使っているPythonに関連するディレクトリにインストールされていくからです

  • which か command -v でどのpython3が使われるのかを知ることができます
    $ which python3
    /Library/Frameworks/Python.framework/Versions/3.12/bin/python3
    
  • 今は、Python本家のPython3が使われていることがわかります

Anacondaと他のPythonのコンフリクト

Anacondaと他のPythonがコンフリクトを起こすことがあります。例えば、以下のような感じです。

(base) foo@macbook:~$ which python3
/Library/Frameworks/Python.framework/Versions/3.12/bin/python3

なんでこんな事が起きるのでしょうか。これは、.bash_profile, もしくは .zprofile に記載される順番になります。

今の場合、私は、Anacondaを入れてからPython.orgのPythonをインストールしました。その場合の .bash_profile は以下のようになっています。

# >>>conda initialize<<<
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/foo/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/Users/foo/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/Users/foo/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/Users/foo/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# >>>conda initialize<<<

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

"conda initialize" で括られている部分が Anaconda の設定です。ここで、condaが実行され、Anacondaの仮想環境が起動したうえで(これは別に記事を書きます)、最後に、"/Users/foo/anaconda3/bin" がパスの最初に来るように設定されています。

その次に Python 3.12 の設定がきます。そして、パスの最初に"/Library/Frameworks/Python.framework/Versions/3.12/bin" が設定されています。
これによって、Anacondaの仮想環境が立ち上がっているにもかかわらず、python3を実行すると、Python3の本家が起動するという複雑な状況がいとも簡単に成り立ってしまうわけです。

実際、パスを確認すると以下のようになっていました。

/Library/Frameworks/Python.framework/Versions/3.12/bin:/Users/foo/anaconda3/bin:/Users/foo/anaconda3/condabin:
/usr/local/freesurfer/7.4.1/bin:/usr/local/freesurfer/7.4.1/fsfast/bin:/usr/local/fsl/share/fsl/bin:
/usr/local/fsl/share/fsl/bin:/usr/local/freesurfer/7.4.1/mni/bin:/usr/local/bin:/usr/local/sbin:
/usr/local/fsl/share/fsl/bin:/usr/local/fsl/share/fsl/bin:/usr/local/bin:
/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:
/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:
/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:
/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:
/Users/foo/bin

ということで、興味本位で色々なバージョンのpythonを入れると、大変なことになることがよくわかります。ただし、pythonには仮想環境というとても良い方法が備わっているので、それを使うことで、色々な問題を解決できます。これは、次のブログの記事に書きます。

なお、FSLとFreeSurferを入れた方は、FSLの python がパスの最初に来るようになってしまい、FSLの python3 が起動してしまいます。この対処法は、こちらのポストに記載しました。

長々と書きましたが、要点としては、以下になりますでしょうか。

  • Python3は色々なところにインストールされている
  • which や command -v でどのpythonを使っているか確認することは必須
  • .bash_profile や .zprofile の記載を確認することで優先順位を理解できる
  • パスを確認し、どのパスが優先順位が高いかを確認するのも良い
  • 綺麗な環境を作るには、仮想環境を構築するのがよい

Pythonについての混乱が少し解けた気がしました。

macOS の Python事情を理解する” へのコメント

  1. ピングバック: LinuxやmacOSでPythonの仮想環境を構築する方法

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください