AmazonLinux2でPython3環境構築

AmazonLinux2には標準でPython2系がインストール済みですが、Python3を入れたい場合に共存してコマンドが面倒なので標準でPython3を使うように変更する手順です。
一旦python自体の仮想環境（pyenv）については記載していません。

# 環境情報

```shell-session:使用AMI-id,OS,カーネルバージョン
$ /opt/aws/bin/ec2-metadata
ami-id: ami-00f045aed21a55240

$ cat /etc/system-release
Amazon Linux 2

$ uname -a
Linux hogehuga.ap-northeast-1.compute.internal 4.14.209-160.335.amzn2.x86_64 #1 SMP Wed Dec 2 23:31:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```

```shell-session:作業前python環境
$ python -V
Python 2.7.18

$ pip --version
bash: pip: command not found

$ pipenv --version
bash: pipenv: command not found
```

# Python
## 各種パッケージ管理システムでのバージョンについて
(2020/12/24現在)amzn2-coreのyumリポジトリでのpythonマイナーバージョンは若干古いです。

```shell-session:通常のyum
$ yum info python3
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Available Packages
Name        : python3
Arch        : i686
Version     : 3.7.9
Release     : 1.amzn2.0.1
Size        : 72 k
Repo        : amzn2-core/2/x86_64
Summary     : Interpreter of the Python programming language
URL         : https://www.python.org/
License     : Python
Description : Python is an accessible, high-level, dynamically typed, interpreted programming
            : language, designed with an emphasis on code readability.
            : It includes an extensive standard library, and has a vast ecosystem of
            : third-party libraries.
            : 
            : The python3 package provides the "python3" executable: the reference
            : interpreter for the Python language, version 3.
            : The majority of its standard library is provided in the python3-libs package,
            : which should be installed automatically along with python3.
            : The remaining parts of the Python standard library are broken out into the
            : python3-tkinter and python3-test packages, which may need to be installed
            : separately.
            : 
            : Documentation for Python is provided in the python3-docs package.
            : 
            : Packages containing additional libraries for Python are generally named with
            : the "python3-" prefix.

Name        : python3
Arch        : x86_64
Version     : 3.7.9
Release     : 1.amzn2.0.1
Size        : 71 k
Repo        : amzn2-core/2/x86_64
Summary     : Interpreter of the Python programming language
URL         : https://www.python.org/
License     : Python
Description : Python is an accessible, high-level, dynamically typed, interpreted programming
            : language, designed with an emphasis on code readability.
            : It includes an extensive standard library, and has a vast ecosystem of
            : third-party libraries.
            : 
            : The python3 package provides the "python3" executable: the reference
            : interpreter for the Python language, version 3.
            : The majority of its standard library is provided in the python3-libs package,
            : which should be installed automatically along with python3.
            : The remaining parts of the Python standard library are broken out into the
            : python3-tkinter and python3-test packages, which may need to be installed
            : separately.
            : 
            : Documentation for Python is provided in the python3-docs package.
            : 
            : Packages containing additional libraries for Python are generally named with
            : the "python3-" prefix.
```

[Extras Library](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html#extras-library)であればPythonの3.8系が使用できます。

```shell-session:ExtrasLibrary
$ amazon-linux-extras list | grep python
 44  python3.8                available    [ =stable ]
```

## Python3.7インストール

```shell-session:
$ sudo yum install -y python3
```

```shell-session:インストール後確認
$ python3 -V
Python 3.7.9
```

## Python3.8インストール
```shell-session:
$ sudo amazon-linux-extras install -y python3.8
```

```shell-session:インストール後確認
$ python3.8 -V
Python 3.8.5
```

## Python3.9インストール
3.9はyumでインストールできないのでソースをDLしてきてコンパイルします。

```shell-session:
$ sudo yum install gcc openssl-devel bzip2-devel libffi-devel
$ cd /opt
$ sudo wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz
$ sudo tar xzf Python-3.9.13.tgz
$ cd Python-3.9.13
$ sudo ./configure --enable-optimizations
$ sudo make altinstall
$ sudo rm -f /opt/Python-3.9.13.tgz
```

```shell-session:インストール後確認
$ python3.9 -V
Python 3.9.13
```


## alias設定

Python3をインストールした状態だと`Python -Vで`バージョン確認しても以前Python 2.7が動作してしまいます。
毎回`3.8`と入力するのは手間なので、エイリアスを設定して`pyhon`コマンド実行時に使用されるバージョンを上書きします。

```shell-session:alias設定
$ echo 'alias python=python3.8' >> ~/.bashrc
$ source ~/.bashrc
```

```shell-session:動作バージョン確認
$ python -V
Python 3.8.5
```


# pip
Python3をインストールした際一緒にインストールされています。ただしこちらも`3.8`等の接尾が必要です。

```shell-session:バージョン確認
$ pip --version
bash: pip: command not found

#python3.7の場合
$ pip3 --version

#python3.8の場合
$ pip3.8 --version
pip 9.0.3 from /usr/lib/python3.8/site-packages (python 3.8)
```

# pipenv
[Homebrew](https://brew.sh/)を使用する方法やpipを使用する方法、その他色々インストール方法はあるみたいですが、pipのみ記載しておきます。

```shell-session:インストール
$ sudo pip3.8 install pipenv
```

```shell-session:バージョン確認
$ pipenv --version
pipenv, version 2020.11.15
```

因みにpipenvをインストールすると前項でcommand not foundだったpipが効くようになります。

```shell-session:バージョン確認
$ pip --version
pip 20.3.3 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
```

## パッケージのインストール

pipenvからパッケージをインストールするとPipfileにパッケージが追加されます．

```console
$ pipenv install numpy    # numpyをインストールする例
```

```toml:Pipfile
[packages]
numpy = "*"
```

### 開発用パッケージのインストール

```console
$ pipenv install --dev autopep8 flake8
```

```toml:Pipfile
[dev-packages]
autopep8 = "*"
flake8 = "*"
```

### requirements.txtからのインストール

`requirements.txt`でパッケージが管理されている場合に、その内容からPipenvでインストールすることもできます。

```console
$ pipenv install -r ./requirements.txt
```

# 参考
[amazon linux2でPython2系からPython3系に切り替える手順 - がじぇったー](https://gadgeterkun.hatenablog.com/entry/20191022/1571712503)
[Amazon Linux 2 で Boto 3 ライブラリを使用して Python 3 仮想環境を作成する](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-python3-boto3/)
[Pipenvと仮想環境 — pipenv 2018.11.27.dev0 ドキュメント](https://pipenv-ja.readthedocs.io/ja/translate-ja/install.html#installing-pipenv)
[Pipenvを用いたPythonの環境構築 - Qiita](https://qiita.com/anvinon/items/5d9c128ef8b65b866dfe)
[Pipenvを使ったPython開発まとめ - Qiita](https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a)
[How to Install Python 3.9 on Amazon Linux 2 - TechAdmin](https://tecadmin.net/install-python-3-9-on-amazon-linux/)