Pythonにはvirtualenvという閉じた環境を作成する素晴しいツールがあり、toxという複数バージョンのテストを自動化してくれるエレガントなツールがある。(個人的主観)
これらのツールを有効に扱うために、複数バージョンのPythonを共存させる要求が出てくる。
(まあ、複数バージョンの共存はPythonに限ったことでもなく、RubyでもPerlでもありうる要求のようで、ちょっと調べればそれ用のライブラリが見つかると思う。)
この要求を楽にかなえるためのソフトウェアとして、pythonbrew, pythonz, pyenv などがある。
でも敢えてHomebrewを使う
理由はなんとなく(笑)。
強いて言うなら、あまり管理ツールを増やしたくないというあたりかと。この手のツールが増えていくと、どれを何でどういうふうに管理しているのかを把握するのが大変だし、設定ファイル(主に.bashrc/.zshrc)も膨れていくので。
Homebrewは汎用的なパッケージマネージャなのでPython以外のソフトウェアも当然提供しているし、(最近知ったことだけど)Homebrew-Caskを使えば、GUIアプリも管理できる。これにできるだけまとめちゃえば、管理が楽だ。
マイナーバージョンのFormulaがあるといったな。あれは嘘だ。
現在のHomebrewのリポジトリのHEADでは、Python2系、3系の最新(2.7, 3.4)のみサポートしており、それ以外のバージョンをインストールすることができない。
% brew search python
gst-python010 python python3 wxpython zpython
homebrew/apache/mod_python
% brew info python
python: stable 2.7.6 (bottled), HEAD
http://www.python.org
…
% brew info python3
python3: stable 3.4.1 (bottled), HEAD
https://www.python.org/
# ただ手元には古いバージョンのFormulaが…いつどこから入れたんだっけ…
% brew list | grep python
python
python26
python3
python31
python32
様々なソフトウェアのバージョン毎のFormulaを提供しているリポジトリはあるが、Pythonだけ無い。何故だ…
https://github.com/Homebrew/homebrew-versions
自分用のHomebrewリポジトリを作成する
なので各バージョンのFormulaを置いたHomebrewのカスタムリポジトリを作成することにした。
リポジトリの作成/使用はとても簡単
- githubに、homebrew-<リポジトリ名>(ex. homebrew-custom) という名前のリポジトリを作成する。
-
brew tap (Githubユーザ名)/(リポジトリ名)
で、作成したリポジトリを登録する。(今回のリポジトリだとFGtatsuro/custom
) -
brew update
で、登録したリポジトリ内のFormulaを取得する。
各Formulaは本家のFormula(python.rb
,python3.rb
)をベースに、以下の変更を加えている。
- インストール時、
make install
ではなくmake altinstall
を使う。これによりpython
,python3
などのシンボリックリンクがHomebrewのbin
以下(default:/usr/local/bin/
)に作成されなくなる。(python3.3
のようなマイナーバージョンまで含んだリンクは作成される。) - pip,easy_installが合わせてインストールされるが、これらのシンボリックリンクも同様、マイナーバージョンまで含まないもの(ex.
pip
,pip2
)は作成されなくなる。
1, 2とも、複数バージョンをインストールした際のシンボリックリンク上書きにより、意図とは違うバージョンを実行するのを避けるためである。
python
のリンクを消してしまうのは賛否両論あると思うが、自分は普段使いの環境もvirtualenvで作成した環境を使用しており、この環境内でそれらのシンボリックリンクが作成されるため特に問題にはならない。
そうでない場合はメインで使いたいバージョンを決めた上で、改めてシンボリックリンクを作成すると良いだろう。
% ln -s /usr/local/bin/python34 /usr/local/bin/python
恒例の横の人の反応は…
「うっはww MakeFile書くだけよくねwww?わざわざHomebrewで管理する意味あんのwww?」(と言ったような気がする)
追記(2014/05/26)
別のFormulaの依存関係で、python
, python3
が求められることがあり、その際にカスタムリポジトリに入れたpython27
, python34
が入っていると衝突する模様。
なので、最新だけは元のリポジトリの物を使った方が無難かな。