Raspberry PiにpyenvをインストールしてPythonをバージョン管理

ラズパイには標準で`3.5.3`のPythonがインストールされていますが、
`3.6`以上のPythonを使いたかったので、pyenvを使用してバージョンを切り替えられるようにしておきます。

# 環境
- Raspberry Pi 3 Model B+
- Raspbian 9.11(stretch)
- Kernel 4.19.66-v7+

```Bash
$ uname -a
# Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux
$ lsb_release -a                 
# No LSB modules are available.
# Distributor ID: Raspbian
# Description:    Raspbian GNU/Linux 9.11 (stretch)
# Release:        9.11
# Codename:       stretch
```

# pyenvのインストール

まず、必要なパッケージのインストールをします。

```Bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
```

githubからpyenvをクローンしてきます。

```Bash
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

コマンドを叩けるようにするため、`.bash_profile`に以下を追記します。

```Bash
$ sudo vi ~/.bash_profile
```

```:.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

`.bash_profile`を再読み込みします。

```Bash
$ source ~/.bash_profile
```

下記コマンドでバージョンが表示されればインストール完了です。

```Bash
$ pyenv --version
#pyenv 1.2.16-5-g7097f820
```

# pyenvでバージョン変更

インストールできるバージョンの一覧を表示してみます。

```Bash
$ pyenv install --list
#Available versions:
#  2.1.3
#  2.2.3
#  ...
#  3.6.0
#  3.6-dev
#  ...
#  stackless-3.4.7
#  stackless-3.5.4
```

今回は`3.6.0`をインストールしてみます。

```Bash
$ pyenv install 3.6.0
```

インストールが完了したら実際にバージョンを変更させてみましょう。

まず変更前のバージョンを確認します。

```Bash
$ python --version
#Python 2.7.13
$ python3 --version
#Python 3.5.3
```

バージョンを変更します。

```Bash
$ pyenv global 3.6.0
```

下記ようにバージョンが変更されました！

```Bash
$ python --version
#Python 3.6.0
$ python3 --version
#Python 3.6.0
```

# pyenvの設定について

pyenvは下記のコマンドで設定します。

```Bash
$ pyenv global x.x.x
```

ちなみにこの`global`の部分を変更することで、適用範囲を設定できます。

||適用範囲|使用用途|
|:--:|:--:|:--:|
|shell|今使用しているシェルにのみ適用|一時的な使用|
|local|カレントディレクトリに適用|フォルダごとに設定したい|
|global|全体に適用|全体のデフォルト環境を変更したい|

`x.x.x`の部分を`system`とすることで元に戻せます。

```Bash:例
$ pyenv local 3.6.4
$ pyenv shell 2.7.6
$ pyenv global system
```

下記のコマンドでインストールしているバージョン一覧を見ることもできます。

```Bash
$ pyenv versions
```

# おまけ

3.7系をインストールしようとしたら下記エラーでインストールできませんでした。

```
$ pyenv install 3.7.0
Downloading Python-3.7.0.tar.xz...
-> https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
Installing Python-3.7.0...

BUILD FAILED (Raspbian 9.11 using python-build 1.2.16-5-g7097f820)

Inspect or clean up the working tree at /tmp/python-build.20200213174102.2652
Results logged to /tmp/python-build.20200213174102.2652.log

Last 10 log lines:
  File "/tmp/tmp01sfxi5t/pip-10.0.1-py2.py3-none-any.whl/pip/_internal/__init__.py", line 42, in <module>
  File "/tmp/tmp01sfxi5t/pip-10.0.1-py2.py3-none-any.whl/pip/_internal/cmdoptions.py", line 16, in <module>
  File "/tmp/tmp01sfxi5t/pip-10.0.1-py2.py3-none-any.whl/pip/_internal/index.py", line 25, in <module>
  File "/tmp/tmp01sfxi5t/pip-10.0.1-py2.py3-none-any.whl/pip/_internal/download.py", line 39, in <module>
  File "/tmp/tmp01sfxi5t/pip-10.0.1-py2.py3-none-any.whl/pip/_internal/utils/glibc.py", line 3, in <module>
  File "/tmp/python-build.20200213174102.2652/Python-3.7.0/Lib/ctypes/__init__.py", line 7, in <module>
    from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'
Makefile:1122: recipe for target 'install' failed
make: *** [install] Error 1
```

`libffi-dev`をインストールすることで3.7系もインストールできました。

```Bash
$ sudo apt install libffi-dev
$ pyenv install 3.7.0
```

今日はここまでです！

#参考
- [pyenv と pyenv-virtualenv で環境構築](https://qiita.com/Kodaira_/items/feadfef9add468e3a85b)