【AWS】素の Cloud9 に Python 3.9 をインストールする

結果何とかなりましたが時間を吸われたので、
備忘録として残します。

## 1. やりたいこと

- AWS Cloud9
  - Python `3.7.10` (既定のバージョン※) を `3.9.0` にアップデートする  
  ※ 2021 年 11 月 24 日 現在

## 2. 前提

- 環境
    - 作成してそのままの Cloud9 (Amazon Linux 2)

## 3. 方法

Python バージョン `3.7.10` からスタートします。

```sh
$ python --version
Python 3.7.10
```

### 3.1. pyenv インストール

まず pyenv をインストールします。

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

# 確認
$ ~/.pyenv/bin/pyenv --version
pyenv 2.2.2-1-gf2925393
```

`~/.bashrc` に以下を記載し、 pyenv コマンドへパスを通します。

```sh:~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
```

変更を適用し、 pyenv コマンドが通ることを確認します。

```sh
$ source ~/.bashrc

# 確認
$ pyenv --version
pyenv 2.2.2-1-gf2925393

$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
```

インストール可能な Python バージョンを表示してみます。

```sh
$ pyenv install --list | grep 3.9.0
  3.9.0
```

上手くいきそうに見えますが、いざインストールすると警告が出てきます。

```sh
# インストールした場合、警告が出る
$ pyenv install 3.9.0
:
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
Installed Python-3.9.0 to /home/ec2-user/.pyenv/versions/3.9.0
```

bzip2 を確認してみると、既にインストールされています。

```sh
$ sudo yum list installed | grep bzip
bzip2.x86_64                          1.0.6-13.amzn2.0.3             @amzn2-core
bzip2-libs.x86_64                     1.0.6-13.amzn2.0.3             @amzn2-core
```

色々調べた結果、足りていないパッケージは `bzip2-devel` でした。

### 3.2. bzip2-devel インストール

念のため yum 自体をアップデートしてからインストールします。

```sh
# 念のためアップデート
$ sudo yum -y update
```

```sh
# bzip2-devel をインストール
$ sudo yum -y install bzip2-devel
:
Installed:
  bzip2-devel.x86_64 0:1.0.6-13.amzn2.0.3                                           

Complete!

# 確認
$ sudo yum list installed | grep bzip                   
bzip2.x86_64                          1.0.6-13.amzn2.0.3             @amzn2-core
bzip2-devel.x86_64                    1.0.6-13.amzn2.0.3             @amzn2-core
bzip2-libs.x86_64                     1.0.6-13.amzn2.0.3             @amzn2-core
```

入りました。

### 3.3. Python 3.9.0 インストール

満を持して Python 3.9.0 をインストールします。

```sh
$ pyenv install 3.9.0
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
Installed Python-3.9.0 to /home/ec2-user/.pyenv/versions/3.9.0

# 確認
$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.9.0
```

警告が消えました。

### 3.4. Python 3.9.0 に切り替える

`pyenv global` で Python バージョンを切り替えます。

```sh
$ pyenv global 3.9.0

# 確認
$ pyenv versions
  system
* 3.9.0 (set by /home/ec2-user/.pyenv/version)
```

しかし、これだけでは Python バージョンは切り替わりません。

```sh
# 切り替わっていない
$ python --version
Python 3.7.10

$ which python
alias python='python3'
        /usr/bin/python3

# 見つからない
$ which python3.9
/usr/bin/which: no python3.9 in (/home/ec2-user/.pyenv/bin:...(省略)
```

Cloud9 ではデフォルトで python コマンドの Alias 設定があるため、切り替わらないようです。

他の記事で見かけるように、 Alias 設定が `~/.bashrc` に見当たらず困っていたのですが、
`~/.bash_profile` に以下を記載することで解決しました。

```sh:~/.bash_profile
export PATH="$HOME/.pyenv/shims:$PATH"
```

変更を適用します。

```sh
$ source ~/.bash_profile

# 確認
$ python --version
Python 3.9.0

$ which python
alias python='python3'
        ~/.pyenv/shims/python3

# 見つかる！
$ which python3.9
~/.pyenv/shims/python3.9
```

無事 Python バージョンを `3.9.0` に切り替えることができました。

pip もアップデートします。

```sh
$ pip install --upgrade pip
:
      Successfully uninstalled pip-20.2.3
Successfully installed pip-21.3.1
```

### 3.5. バージョン確認

```sh
$ python --version
Python 3.9.0

$ pyenv versions
  system
* 3.9.0 (set by /home/ec2-user/.pyenv/version)

$ pip -V
pip 21.3.1 from /home/ec2-user/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pip (python 3.9)
```

いい感じになりました！


## 4. 参考サイト

- [pyenvによる仮想Python環境をAWS Cloud9上で構築する](https://dev.classmethod.jp/articles/aws-cloud9-pyenv/#toc-1)
- [pythonのバージョンが切り替わらない](https://qiita.com/mckyhrs/items/94a2db3506287df0420e)

ありがとうございました。