💻

【AWS】【EC2】Python3.8/3.9をインストールしよう

2025/01/04に公開

Amazon Linux2 には、Python がデフォルトで入っています

ただ、開発環境とバージョンが異なる場合、入れなおす必要がある ため、 その方法をご紹介します

現状を確認しよう

Python

デフォルトでは、Python 2.7.10がインストールされています

[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 2.7.18

Python3 と指定すると 3.7.10がインストールされています

[ec2-user@ip-×××-××-××-×× ~]$ python3 -V
Python 3.7.10

また、Extras Library にあれば、amazon-linux-extras コマンドでインストールできます

[ec2-user@ip-×××-××-××-×× ~]$ amazon-linux-extras list | grep python
 44  python3.8                available    [ =stable ]

→  Python3.8 は、インストールできます

pip

pip とは、Python のパッケージ管理ツールのことです。

pip はありませんが、pip3 はあります

[ec2-user@ip-×××-××-××-×× ~]$ pip --version
-bash: pip: command not found
[ec2-user@ip-×××-××-××-×× ~]$ pip3 --version
pip 20.2.2 from /usr/lib/python3.7/site-packages/pip (python 3.7)

pip に関して詳しく知りたい方は以下をご参考ください

https://www.sejuku.net/blog/50417

Python 3.8/3.9 をインストール

Python3.8

amazon-linux-extras コマンドでインストールしていきます-yをつけると、y/N と聞かれなくなります(すべて y でインストール)

※ec2-user なので、sudo つけて実行しています

(実行コマンド)

python3.8 -V  #python3.8 がないことの確認
sudo amazon-linux-extras install python3.8 -y
python3.8 -V  #バージョンが表示されればOK

(実行結果)

[ec2-user@ip-×××-××-××-×× ~]$ python3.8 -V
-bash: python3.8: command not found
[ec2-user@ip-×××-××-××-×× ~]$ sudo amazon-linux-extras install python3.8 -y
[sudo] password for ec2-user:
Installing python38
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-kernel-5.10 amzn2extra-nginx1 amzn2extra-python3.8
22 metadata files removed
8 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
(略)
[ec2-user@ip-×××-××-××-×× ~]$ python3.8 -V
Python 3.8.5

Python3.9

3.9 は yum や amazon-linux-extras でインストールできないので Python のソースをダウンロードしてきてコンパイルします。

今回は、Python 3.9.12 をインストールします

各コマンドの詳細は下記をご参考ください

https://hibiki-press.tech/python/install-from-source/5046

(実行コマンド)

python3.9 -V
sudo yum install gcc openssl-devel bzip2-devel lib -y
cd /opt
sudo wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz
sudo tar xzf Python-3.9.12.tgz
ll | grep Python
cd Python-3.9.12
sudo ./configure --enable-optimizations
sudo make altinstall
cd /opt
ll | grep Python
sudo rm -f Python-3.9.12.tgz
ll | grep Python
python3.9 -V

(実行結果)

[ec2-user@ip-×××-××-××-×× ~]$ python3.9 -V
-bash: python3.9: command not found
[ec2-user@ip-×××-××-××-×× ~]$ sudo yum install gcc openssl-devel bzip2-devel libffi-devel -y
[sudo] password for ec2-user:
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                          | 3.7 kB  00:00:00
Resolving Dependencies
--> Running transaction check
()
[ec2-user@ip-×××-××-××-×× opt]$ cd /opt
[ec2-user@ip-×××-××-××-×× opt]$ ll | grep Python
drwxrwxr-x 16 ec2-user ec2-user 4096 Mar 24 2022 Python-3.9.12
-rw-r--r-- 1 root root 26338472 Mar 24 2022 Python-3.9.12.tgz
[ec2-user@ip-×××-××-××-×× Python-3.9.12]$ cd Python-3.9.12
[ec2-user@ip-×××-××-××-×× Python-3.9.12]$ sudo ./configure --enable-optimizations
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for python3.9... no
checking for python3... python3
()
[ec2-user@ip-×××-××-××-×× Python-3.9.12]$ sudo make altinstall
gcc -pthread -c -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -DPy_BUILD_CORE -o Programs/python.o ./Programs/python.c
gcc -pthread -c -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -DPy_BUILD_CORE -o Parser/acceler.o Parser/acceler.c
gcc -pthread -c -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -DPy_BUILD_CORE -o Parser/grammar1.o Parser/grammar1.c
()
[ec2-user@ip-×××-××-××-×× Python-3.9.12]$ cd /opt
[ec2-user@ip-×××-××-××-×× opt]$ ll | grep Python
drwxrwxr-x 17 ec2-user ec2-user 4096 Oct 10 18:46 Python-3.9.12
-rw-r--r-- 1 root root 26338472 Mar 24 2022 Python-3.9.12.tgz
[ec2-user@ip-×××-××-××-×× opt]$ sudo rm -f Python-3.9.12.tgz
[ec2-user@ip-×××-××-××-×× opt]$ ll | grep Python
drwxrwxr-x 17 ec2-user ec2-user 4096 Oct 10 18:46 Python-3.9.12
[ec2-user@ip-×××-××-××-×× opt]$ python3.9 -V
Python 3.9.12

ちなみに、python や python3 のバージョンを確認すると、デフォルトと変わりませんので、ご注意ください

[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 2.7.18
[ec2-user@ip-×××-××-××-×× ~]$ python3 -V
Python 3.7.10

pip

Python3 を入れた段階で一緒にインストールされます

(Python3.8 をインストールした場合)

[ec2-user@ip-×××-××-××-×× ~]$ pip3.8 --version
pip 21.0.1 from /usr/lib/python3.8/site-packages/pip (python 3.8)

(Python3.9 をインストールした場合)

[ec2-user@ip-×××-××-××-×× ~]$ pip3.9 --version
pip 22.0.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)

ちなみに、まだpip コマンドは使用できません

[ec2-user@ip-×××-××-××-×× ~]$ pip --version
-bash: pip: command not found

コマンドの設定

Python 3.8/3.9 や pip 3.8/3.9 をインストールしたはいいけど、 毎回、python3.8 とか pip3.8 というコマンドを使用するのは面倒ですよね...

2通りの方法があります

  1. alias を設定そのユーザーのコマンドのみ書き換える
  2. python、pip コマンド のパスを変えるサーバー全体のコマンドを書き換える ※ amazon-linux-extras コマンドが使用できなくなるため、ご注意ください

alias を設定

alias(コマンドの別名)を設定して、 python や pip コマンドが python3.8/3.9 や pip3.8/3.9 を実行できるようにします

・Python3.8 の場合
(実行コマンド)

echo 'alias python=python3.8' >> ~/.bashrc
echo 'alias pip=pip3.8' >> ~/.bashrc
source ~/.bashrc
python -V
pip --version

(実行結果)

[ec2-user@ip-×××-××-××-×× ~]$ echo 'alias python=python3.8' >> ~/.bashrc
[ec2-user@ip-×××-××-××-×× ~]$ echo 'alias pip=pip3.8' >> ~/.bashrc
[ec2-user@ip-×××-××-××-×× ~]$ source ~/.bashrc
[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 3.8.5
[ec2-user@ip-×××-××-××-×× ~]$ pip --version
pip 21.0.1 from /usr/lib/python3.8/site-packages/pip (python 3.8)

・Python3.9 の場合
(実行コマンド)

echo 'alias python=python3.9' >> ~/.bashrc
echo 'alias pip=pip3.9' >> ~/.bashrc
source ~/.bashrc
python -V
pip --version

(実行結果)

[ec2-user@ip-×××-××-××-×× ~]$ echo 'alias python=python3.9' >> ~/.bashrc
[ec2-user@ip-×××-××-××-×× ~]$ echo 'alias pip=pip3.9' >> ~/.bashrc
[ec2-user@ip-×××-××-××-×× ~]$ source ~/.bashrc
[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 3.9.12
[ec2-user@ip-×××-××-××-×× ~]$ pip --version
pip 22.0.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)

python、pip コマンド のパスを変える

※ amazon-linux-extras コマンドが使用できなくなるため、ご注意ください

まず、python コマンドのパス(どこにあるか) を調べます

コマンドのパスを調べるときは which コマンドを使用します

[ec2-user@ip-×××-××-××-×× ~]$ which python
/usr/bin/python
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python
lrwxrwxrwx 1 root root 7 Sep 15 06:00 /usr/bin/python -> python2
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python2
lrwxrwxrwx 1 root root 9 Sep 15 06:00 /usr/bin/python2 -> python2.7
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python2.7
-rwxr-xr-x 1 root root 7048 May 25 23:31 /usr/bin/python2.7

python コマンドは、/usr/bin/pythonという場所にあるので、そこを見てみます

ll /usr/bin/pythonでファイルを見てみると、シンボリックリンクとなっています

シンボリックリンクとは?

ショートカットのようにほかのファイルを参照しているもののこと

参照先の python2 というフォルダも python2.7 を参照しています。

つまり、python -> python2 -> python2.7 と参照しており、 python コマンドは最終的に python2.7 にたどりつくため、

[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 2.7.18

となります。

これを python3.8/3.9 に向けたいので、 /usr/bin/python の参照先を python3.8/3.9にします

正確には、python -> python3 -> python3.8/3.9 と参照するようにします

python3.8/3.9 のパスを which コマンドで確認します

[ec2-user@ip-×××-××-××-×× ~]$ which python3.8
/usr/bin/python3.8
[ec2-user@ip-×××-××-××-×× ~]$ which python3.9
/usr/local/bin/python3.9

また、python3 のパスを確認すると、

[ec2-user@ip-×××-××-××-×× ~]$ which python3
/usr/bin/python3
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 9 Sep 15 06:00 /usr/bin/python3 -> python3.7
[ec2-user@ip-×××-××-××-×× ~]$ python3 -V
Python 3.7.10

/usr/bin/python3になります

これもシンボリックリンクになっており、python3.7 を参照しています

なので、python3 のバージョンを確認すると、3.7.10 と表示されるわけです。

さて、具体的な作業を確認します。

目的は python -> python3 -> python3.8/3.9 と参照させることです。

  1. python の参照先を python3 に変更する
  2. python3 の参照先を python3.8/3.9 に変更する

python の参照先を python3 に変更する

ln コマンドを使用して参照先を変更していきます

詳細は下記の記事をご参考ください

https://qiita.com/takeoverjp/items/bb1576e90a8a495db4b3

(実行コマンド)

sudo ln -nfs /usr/bin/python3 /usr/bin/python

※ec2-user なので、sudo つけて実行します

(実行結果)

[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python
lrwxrwxrwx 1 root root 7 Sep 15 06:00 /usr/bin/python -> python2
[ec2-user@ip-×××-××-××-×× ~]$ sudo ln -nfs /usr/bin/python3 /usr/bin/python
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python
lrwxrwxrwx 1 root root 16 Oct 10 23:21 /usr/bin/python -> /usr/bin/python3
[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 3.7.10

/usr/bin/python の参照先が /usr/bin/python3 に変更されており、 python -V の結果も、3.7.10 になりました

python3 の参照先を python3.8/3.9 に変更する

(実行コマンド)
・python3.8 の場合

sudo ln -nfs /usr/bin/python3.8 /usr/bin/python3

・python3.9 の場合

sudo ln -nfs /usr/local/bin/python3.9 /usr/bin/python3

(実行結果)
・python3.8 の場合

[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 18 Oct 10 23:20 /usr/bin/python3 -> /usr/bin/python3.7
[ec2-user@ip-×××-××-××-×× ~]$ sudo ln -nfs /usr/bin/python3.8 /usr/bin/python3
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 18 Oct 10 23:29 /usr/bin/python3 -> /usr/bin/python3.8
[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 3.8.5

・python3.9 の場合

[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 18 Oct 10 23:30 /usr/bin/python3 -> /usr/bin/python3.7
[ec2-user@ip-×××-××-××-×× ~]$ sudo ln -nfs /usr/local/bin/python3.9 /usr/bin/python3
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/python3
lrwxrwxrwx 1 root root 24 Oct 10 23:30 /usr/bin/python3 -> /usr/local/bin/python3.9
[ec2-user@ip-×××-××-××-×× ~]$ python -V
Python 3.9.12

pip コマンドも設定する

pip コマンドはそもそも使用できず、which コマンドで調べてもないよーと返ってきます

[ec2-user@ip-×××-××-××-×× ~]$ pip --version
-bash: pip: command not found
[ec2-user@ip-×××-××-××-×× ~]$ which pip
/usr/bin/which: no pip in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin)

pip3.8/3.9 のパスを調べました

[ec2-user@ip-×××-××-××-×× ~]$ which pip3.8
/usr/bin/pip3.8
[ec2-user@ip-×××-××-××-×× ~]$ which pip3.9
/usr/local/bin/pip3.9

pip3.8/3.9 のシンボリックリンクを /usr/bin/pip として作成します

(実行コマンド)
・pip3.8

sudo ln -nfs /usr/bin/pip3.8 /usr/bin/pip

・pip3.9

sudo ln -nfs /usr/local/bin/pip3.9 /usr/bin/pip

(実行結果)
・pip3.8

[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/pip
ls: cannot access /usr/bin/pip: No such file or directory
[ec2-user@ip-×××-××-××-×× ~]$ sudo ln -nfs /usr/bin/pip3.8 /usr/bin/pip
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/pip
lrwxrwxrwx 1 root root 15 Oct 10 23:41 /usr/bin/pip -> /usr/bin/pip3.8
[ec2-user@ip-×××-××-××-×× ~]$ pip --version
pip 21.0.1 from /usr/lib/python3.8/site-packages/pip (python 3.8)

・pip3.9

[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/pip
ls: cannot access /usr/bin/pip: No such file or directory
[ec2-user@ip-×××-××-××-×× ~]$ sudo ln -nfs /usr/local/bin/pip3.9 /usr/bin/pip
[ec2-user@ip-×××-××-××-×× ~]$ ll /usr/bin/pip
lrwxrwxrwx 1 root root 21 Oct 10 23:43 /usr/bin/pip -> /usr/local/bin/pip3.9
[ec2-user@ip-×××-××-××-×× ~]$ pip --version
pip 22.0.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)

これで、python や pip コマンドで Python3.8/3.9 と pip3.8/3.9  が使えるようになりました

参考記事

https://qiita.com/hiren/items/17984191da2ab8955174

https://freeheroblog.com/ec2-python38/

https://note.nkmk.me/python-pip-install-requirements/

https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015

https://qiita.com/ryouya3948/items/8edbd5d744c83dd41141

Discussion