MacBook(macOS)にPython3環境を導入してデフォルトに設定する

この記事は最終更新日から1年以上が経過しています。情報が古くなっている可能性があります。

MacBook に Python 環境を導入していたが、macOS には Python2 (サポート終了済み) が標準で入ってるのに Python3 は入ってなかったりとごちゃごちゃとした状態だったので、Python3 をインストールしてデフォルトの Python に設定してみるメモ。

Sponsored Link

注意

この記事では Python3 を導入し、macOS に標準で付属している Python2 をできるだけ置き換える(封印する)方向で設定します(Python3 が python コマンドで実行できる状態にする)。
作業は macOS Mojave / MacBook Air 2018 上で設定しています。

一部間違いが含まれている可能性もあるため、作業はすべて自己責任にて行ってください。
なお、Homebrew はすでに入っていて Python3 はインストールされていないものとして進めます。

あとあと使ってたらやっぱり pyenv の方がよくないか…ってなってきたので、この方法はおすすめしません(結局苦労するし素直に pyenv 使ったほうが楽( virtualenv とは別らしい))。

状態を確認する

まずは現在の状態を確認。

ターミナル(ここでは iTerm を使う)を開き、

$ python -V
Python 2.7.16

と実行する。
Python 2.7.16 のように表示される場合は Python2 がインストールされている。

$ which python
/usr/bin/python

と実行し、/usr/bin/python と表示されていれば macOS 標準の Python2 がインストールされている。

Homebrew でインストールしたソフトは標準では /usr/local/bin ディレクトリ (フォルダ) 以下にインストールされる(場所は変更することもできる)ので、/usr/bin 以下にインストールされているため標準で入っている Python2 である事が推測できる。

Homebrew の場合、正確には /usr/local/Celler 以下にインストールされたパッケージへのシンボリックリンクが /usr/local/bin に置かれている(後述)。

標準の Python2 用の pip をアンインストールする

標準でインストールされている Python2 用の pip が入っている場合(標準で入ってたかどうかわすれた)、念のためアンインストールしておこう(参考)。
もし pip がインストールされていない場合はこの手順は飛ばして構わない。

標準の Python2 用の pip は easy_install という pip 登場以前にあった古いパッケージ管理システムでインストールされたものらしい。
アンインストールは必須ではないが、Python3 を使うので Python2 の pip は使わないし、標準の Python2 用の pip パッケージがインストールされる場所の関係で pip install は sudo をつけて管理者権限で実行しないとインストールできないため、仮に Python2 が必要な場合でも使うのはおすすめしない。
$ sudo easy_install -mxN pip
Searching for pip
Best match: pip 20.2b1
Processing pip-20.2b1-py2.7.egg

Using /Library/Python/2.7/site-packages/pip-20.2b1-py2.7.egg
Because this distribution was installed --multi-version, before you can
import modules from this package in an application, you will need to
'import pkg_resources' and then use a 'require()' call similar to one of
these examples, in order to select the desired version:

    pkg_resources.require("pip")  # latest installed version
    pkg_resources.require("pip==20.2b1")  # this exact version
    pkg_resources.require("pip>=20.2b1")  # this version or higher

上記のコマンドを実行し、参照を解除する。
このとき、実行結果内にある pip のバージョンを確認しておこう(この場合は 20.2b1)。

$ sudo rm -rf /Library/Python/2.7/site-packages/pip-20.2b1-py2.7.egg

と実行し、pip をアンインストールする。
上記のコマンドでは pip-20.2b1-py2.7.egg となっているが、20.2b1 の部分は適宜自分の pip バージョンに合わせて書き換えてから実行する。

最後に、/usr/local/bin においてある pippip2pip2.7 といったコマンドを削除する。

$ sudo rm -rf /usr/local/bin/pip*

と実行しよう。

macOS 付属の Python2 自体は削除できない(システムの一部として管理されている)。
/usr/bin/python/usr/bin/python2 にリネームできないかやってみたが、システム整合性保護 (SIP) で守られているらしく「Operation not permitted」という見たことないエラーが出て案の定ダメだった。

Homebrew で Python3 をインストールする

Homebrew で Python3 をインストールする。
Python の公式サイトから .pkg をダウンロードしてきてインストールすることもできるが、アンインストールが結構面倒だったりするのであまりおすすめしない(参考)。

$ brew install python

と実行する。

$ python3 -V
Python 3.7.7

と実行し、Python 3.7.7 と表示されれば OK(3.7.7 の部分はインストールしたバージョンによって変わる)。

注意:2020年6月現在 Homebrew でインストールできる最新バージョンの Python 3.7.7(Python 3.7系)をインストールしたものとして説明していますが、もっと新しいバージョンをインストールした場合はコマンドを適宜 3.7.7 → 3.8.3 ・ 3.7 → 3.8 のように書き替えてから実行してください。

Python3 をデフォルトに設定する

Homebrew でインストールした場合、macOS 標準で用意されている python コマンド (Python2) と衝突しないようにするためか、上記のように Python3 は python3 コマンド、Python3 用の pip は pip3 コマンドとなっているが、これを pythonpip コマンドだけで Python3 が実行できるようにしてみる。

このうち pip は先程アンインストールしているが、pip コマンド

alias を ~/.bash_profile に登録する方法がメジャーだが、ここでは別の方法でやってみる。

$ python -V
Python 2.7.16
$ python3 -V
Python 3.7.7

この時点で、python -V と実行すると macOS 組み込みの Python2 が、python3 -V と実行すると Homebrew でインストールした Python3 が実行される状態のはず。

Python の公式サイトからダウンロードした .pkg からインストールした場合、実際に配置されるフォルダは Homebrew でインストールした場合と異なる (/Library/Frameworks/Python.framework/Versions/3.7/bin) が、Python3 を python コマンドではなく python3 コマンドで実行する点は変わらない。

python3pip3 といったコマンドは /usr/local/Cellar/python/3.7.7/bin 以下にインストールされていて、環境変数 $PATH が通っている /usr/local/bin 以下に実行ファイルへのシンボリックリンクが貼られている。

たとえば、/usr/local/bin/python3/usr/local/Cellar/python/3.7.7/bin/python3 へのシンボリックリンクになっている。
これを利用し、/usr/local/bin/python3 へのシンボリックリンク、 /usr/local/bin/python を作ることで python -V と実行したときに Python3 を呼び出すようにする。

環境変数 $PATH は(少なくとも私の環境では)/usr/local/bin が macOS 組み込みの Python2 が入っている /usr/bin よりも左側に設定されている($PATH は左側に書かれているパスほど優先されるらしい)ため、/usr/bin にある python ではなく /usr/local/bin にある python が使われる。

$PATH の内容はターミナル上で printenv PATH と実行すると表示できる。
$ ln -nfs /usr/local/bin/python3 /usr/local/bin/python

と実行し、シンボリックリンクを作成する。

$ ln -nfs /usr/local/bin/pip3 /usr/local/bin/pip
$ ln -nfs /usr/local/bin/easy_install-3.7 /usr/local/bin/easy_install
$ ln -nfs /usr/local/bin/idle3 /usr/local/bin/idle
$ ln -nfs /usr/local/bin/pydoc3 /usr/local/bin/pydoc
$ ln -nfs /usr/local/bin/python3-config /usr/local/bin/python-config
$ ln -nfs /usr/local/bin/wheel3 /usr/local/bin/wheel

pip3 などの Python3 と同時にインストールされるコマンドのシンボリックリンクも同時に作成しておく。

念のため、ターミナルを閉じてもう一度起動する。

$ python -V
Python 3.7.7
$ pip -V
pip 20.0.2 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

実行してみて、Python 3.7.7 のようになっていれば OK。

$ which python
/usr/local/bin/python
$ which pip
/usr/local/bin/pip

which コマンドでパスを調べると /usr/local/bin 以下に配置されていることが確認できる。

Python3 環境の導入は以上で終了。よき Python ライフを(?)

コメント