`python3` を呼び出した時、HomeBrew でインストールした特定バージョンの Python を呼びだしたい
この記事は、かなり適当に書いています。
はじめに
Homebrew は macOS を利用するデベロッパーならほとんどの人が一度は使ったことのあるであろうパッケージマネージャです。
「パッケージマネージャ」とは、「コンピュータのプログラムを一貫した方法でインストールやアンインストール、ライブラリなどの依存関係を解決する流れをツールによって管理を自動化するシステム」のことを指します。
HomeBrew での Python のインストール(基本)
HomeBrew で Python をインストールする際、通常、次の手順を取ります。
brew install python3
この手順では、通常 Brew のレジストラに登録された最新のバージョンをインストールしに行く指示となります。執筆時(2024年4月現在)では、3.12
が bugfix
扱いの最も若いバージョンのリリースなので、3.12
がインストールされました。
$ python3 -VV
Python 3.12.2 (main, Feb 6 2024, 20:19:44) [Clang 15.0.0 (clang-1500.1.0.2.5)]
また、特定のバージョンをインストールする際は、次のように端末に入力します。
brew install python@3.11
すると、python3.11
とすることで、3.11
が実行されます。
$ python3.11 -VV
Python 3.11.9 (main, Apr 2 2024, 08:25:04) [Clang 15.0.0 (clang-1500.3.9.4)]
特定のバージョンを呼び出したい時、これが推奨される方法です。
本題
通常のソフトウェアでは、多くの場合、最も新しいバージョンを利用していれば何ら問題はないでしょう。
しかし、Python は魔境です。3.11
で実行できていたライブラリが、3.12
では動かないなどということはよくあります。特に出始めのバージョンだと[1]。
そんな状況下で、Python3.11
などと繰り返し入力することは大変馬鹿げていると思うこともあるでしょう。ああ、python3
と呼び出したら、特定のバージョンを呼び出せるようにならないものか。
単純な解決策 (エイリアスを利用する)
.zprofile
に以下の行を書き加えてみましょう。
alias python3="python3.11" // 3.11 の部分には任意のバージョンを記述
するとあら不思議、
$ python3 -VV
Python 3.11.9 (main, Apr 2 2024, 08:25:04) [Clang 15.0.0 (clang-1500.3.9.4)]
3.11
が呼び出されますね。ちなみ本来の Python3 を呼び出したければ、"python3"
とダブルクォーテーションでくくる必要があります。
$ "python3" -VV
Python 3.12.2 (main, Feb 6 2024, 20:19:44) [Clang 15.0.0 (clang-1500.1.0.2.5)]
しかし、この方法は公式は推奨していません(リンク)。変な状況[2]に遭遇する可能性があります。
例えば、世の中には無数のライブラリがあります。
その中には 3.8 以前では動くけど、それ以降では動かないものもあるでしょうし、3.11 以降では動くけど、それ以前では動かないものもあるでしょう。そうしたプロジェクトに着手する前にエイリアスを毎回書き換えるつもりですか? これはナンセンスな行動だと思います。
良い解決策
じゃあ、どうするの?
適切な「パッケージ(もしくはバージョン)管理ツール(もしくは仮想環境)[3]」を利用しましょう。
これが頭のいい過去の開発者のみなさんが考え出した答えです。
バージョン管理システムは、ディレクトリ(プロジェクト)ごとに違ったバージョンを適切に選んでくれます。
Python 標準では「venv」がバンドルされていますし、最も有名なものとして「pyenv」なども挙げられます。パッケージ管理ツールとして「rye」なども同様の機能を提供します[4]。
こういったものを適切に用いることで、Python のバージョンやライブラリのバージョンを適切に扱うことができます。つまり、python3
で適切な任意のバージョンを読み出すことができるようになります!
さまざまなツールのインストール方法やその良し悪しは、ここでは解説しません。もっと簡単に書いてくれているプロの記事が、たくさんありますので、そちらを参照してください。
おわりに
良い Python ライフをお送りください。
-
逆を例に出した方が適切かもしれません。例えば NumPy では、NumPy のあるバージョンが発表される以前に発表された Python のバージョンでは割と実行できないことが場合によってはあり、かみ合わないと動かないことがあります。誰もがお世話になったことのある 金子邦彦研究室 でも、そのような FAQ が用意されています(リンク)。
なお、これを回避するためにライブラリのバージョンをプロジェクト単位で管理できる「pipenv」や「rye」をつかうこともできます。 ↩︎ -
今回は
.zprofile
に書き込んだので、シェルスクリプトやインタラクティブシェルに影響はないはずだが、Python 3.12 でしか動かないソフトがpython3
を呼び出すことで、Python 3.11 にアクセスしようとして、起動しないことが起こりうるかもしれない、などの状況。 ↩︎ -
なぜこんなに微妙にツールの名前をはっきりと言えてないかというと、ツールによって微妙に扱う範囲が違うことで、ツールが自称する名前が多様だからです。 ↩︎
-
中で venv が動いています。 ↩︎
Discussion