pyenv経由でMacにPythonをインストールする

MacにはデフォルトでPythonがインストールされていますが、バージョンが古く、今後複数のバージョンを使用する可能性も考慮してバージョン管理ツールである「pyenv」(ぱいえんぶ)を使って新しいPythonをインストールしてみました。

2021/5以降はパスを通す際に一部記述を変更する必要があるということがあったので、記事にしました。内容に不備などありましたら教えていただけると幸いです。


# Homebrewのバージョン確認

まずは``pyenv``のインストールをするために``Homebrew``を準備します。Macでは最初から用意されていますが、一応確認しておきます。

ターミナルを開き、下記コードをコピペしてください。

~~~SHELL
brew -v
~~~

以下のようになったらOKです。

~~~SHELL
Homebrew 3.2.0
~~~

もし``brew: command not found``とか出てきた場合はHomebrewがインストールされていませんので、下記の記事などを参考にお持ちのPCにHomebrewをインストールしてください。

https://qiita.com/zaburo/items/29fe23c1ceb6056109fd

# pyenvをインストールする

続いてPythonのバージョン管理ツール「pyenv」をインストールします。
一応既にインストールされているか、下記のコードを入力してみてください。

~~~SHELL
pyenv -v
~~~

インストールした覚えはないので、「コマンドが見つかりません」的なメッセージが返ってくるのではないでしょうか。

~~~SHELL
pyenv: command not found
~~~

ですよね。

もしここで、

~~~SHELL
pyenv x.x.x
~~~

のようにバージョン名が表示されていれば、既にインストールされているので、以下のコマンドは飛ばして結構です。

私と同様、まだインストールしていない方は以下のコマンドを入力し、``pyenv``をインストールしましょう。

~~~SHELL
brew install pyenv
~~~

こういう画面が出ました。
よくわからないけど、できてるっぽい。

~~~SHELL
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
baidupcs-go  pillow       plow         pyflow       soapyrtlsdr  soapysdr     terminator   waypoint
==> Updated Formulae
Updated 146 formulae.
==> New Casks
affinity-photo    castr             ears              hyperkey          keyboardholder    lagrange
==> Updated Casks
Updated 83 casks.

==> Downloading https://ghcr.io/v2/homebrew/core/pyenv/manifests/2.0.1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:06646f2a7779fc545226e0a79b26e3c7a3e50f5
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:06646f2a7779fc545226e0
######################################################################## 100.0%
==> Pouring pyenv--2.0.1.big_sur.bottle.tar.gz
🍺  /usr/local/Cellar/pyenv/2.0.1: 760 files, 2.6MB
~~~

ちゃんとインストールできたか確認しましょう。

~~~SHELL
pyenv -v
~~~
すると以下のようになりました。

~~~SHELL
pyenv 2.0.1
~~~

順調です。いい感じ。

# pyenvのPATHを通す

こういう、新しくツールをインストールしたときはPATH通さなきゃ使えないんですよね。私の場合シェルは``zsh``を使っているので、Qiitaなどを参考に以下のコードを入力しました。

~~~SHELL
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
~~~

``zshrc``を書き換えたときは変更を反映させる必要があります。

以下のコードを入力してください。

~~~SHELL
source ~/.zshrc
~~~

(参考記事)
[【投稿】bashが起動時〜bashrcとbash_profileについて〜　自分メモ用](https://qiita.com/ginokinh/items/45ac4cd16f766a426532)

するとこんな表示が、、

~~~SHELL
WARNING: `pyenv init -` no longer sets PATH.
Run `pyenv init` to see the necessary changes to make to your configuration.
~~~

おとなしく言われた通りにコードを入力してみる。

~~~SHELL
pyenv init
~~~

すると以下のような表示が返ってきました。

~~~SHELL
# (The below instructions are intended for common
# shell setups. See the README for more guidance
# if they don't apply and/or don't work for you.)

# Add pyenv executable to PATH and
# enable shims by adding the following
# to ~/.profile and ~/.zprofile:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"  # <--- ココがなんか違う

# Load pyenv into the shell by adding
# the following to ~/.zshrc:

eval "$(pyenv init -)"

# Make sure to restart your entire logon session
# for changes to profile files to take effect.
~~~

あれ、さっき``zshrc``に書いたのと違うやつがいる。
ということでコードを修正します。(vimコマンドを使ってターミナル上で済ませます。)

~~~SHELL
vi .zshrc
~~~

`i`キーを押してインサートモードにした上で、先ほどの

~~~SHELL
eval "$(pyenv init --path)"
~~~
に書き換えましょう。
書き換えたら`esc`キーでコマンドモードに戻り、`:wq`で保存して終了します。

そして`zshrc`を書き換えたら変更を反映させましょう。

~~~SHELL
source ~/.zshrc
~~~

最初からコレ書いとけよ、というご意見はごもっともなのですが、執筆時現在において多くの教材や記事に上記コードで説明されているものが多かったため、あえてそのままの流れて書いています。ご了承くださいませ。

で、Githubのイシュー見るともうそのままのことが書いてありますね。2021年5月にあった仕様の変更で今回のような警告が出るようになったみたいです。
https://github.com/pyenv/pyenv/issues/1906

# Pythonをインストールする

さて、気を取り直してPythonのインストールをしていきます。
今回は、先ほどインストールした`pyenv`を使います。
まずは以下のコードを入力してみましょう。

~~~SHELL
pyenv install --list
~~~

インストール可能なPythonのバージョン一覧が表示されます。

~~~SHELL
Available versions:
  2.1.3
  2.2.3
  ~~
  3.9.5
  3.10.0b2
  3.10-dev
  ~~
  stackless-3.5.4
  stackless-3.7.5

~~~

今回は`3.9.5`をインストールします。

~~~SHELL
pyenv install 3.9.5
~~~

結構時間がかかりましたが、以下のような表示が返ってきました。

~~~SHELL
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.5.tar.xz...
-> https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz
Installing Python-3.9.5...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.9.5 to /Users/bnn/.pyenv/versions/3.9.5
~~~

よくわかりませんが、できてるみたいです。
Pythonのバージョンを確認してみましょう。

~~~SHELL
python --version
~~~

~~~SHELL
Python 2.7.16
~~~

あれ？
あぁ、pyenvを用いて使用するPythonのバージョンを変更する必要がありました。

では以下のコードで`pyenv`で管理しているPythonのバージョン一覧を確認してみましょう。

~~~SHELL
pyenv versions
~~~

すると以下の表示が返ってきました。

~~~SHELL
* system (set by /Users/bnn/.pyenv/version)
  3.9.5
~~~

インストールはできているけどデフォルトのバージョンを使っているということです。せっかくインストールしたんだから最新版を使いたいです。

~~~SHELL
pyenv global 3.9.5
~~~

これで使用するバージョンを変更できます。
再度バージョンを確認してみましょう。


~~~SHELL
pyenv versions
~~~

すると以下の表示が返ってきました。

~~~SHELL
  system
* 3.9.5 (set by /Users/bnn/.pyenv/version)
~~~

ちゃんと切り替わっているみたいです。
一応Pythonコマンドでも確認してみます。

~~~SHELL
python --version
~~~

ドキドキ...


~~~SHELL
Python 3.9.5
~~~

完璧です。
天才かもしれません。

# さいごに

今回はバージョン管理ツールの`pyenv`のインストール及びパスの通し方、使用するバージョンの変更方法について理解することができました。

予期せぬ警告が出たときは、落ち着いて読んでみることが大事ですね。