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

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

Sponsored Link

注意

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

一部間違いが含まれている可能性もあるため、作業はすべて自己責任にて行ってください。
なお、Homebrew (brew) はすでに入っていて 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 においてある pip・pip2・pip2.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 ライフを(?)

追記

当然っちゃそうなんだけど brew upgrade で Python が 3.7.8 とかに上がるとシンボリックリンクを全部更新しないといけないことに気づきコマンドを一部変更しました。
普通にエイリアス作ったほうが無難だったかも…。。

Sponsored Link
Sponsored Link
macOS
tsukumiをフォローする
Sponsored Link
つくみ島だより

コメント