【AWS】【EC2】Python3.8/3.9をインストールしよう
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 に関して詳しく知りたい方は以下をご参考ください
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 をインストールします
各コマンドの詳細は下記をご参考ください
(実行コマンド)
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通りの方法があります
- alias を設定→そのユーザーのコマンドのみ書き換える
- 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 と参照させることです。
- python の参照先を python3 に変更する
- python3 の参照先を python3.8/3.9 に変更する
python の参照先を python3 に変更する
ln コマンドを使用して参照先を変更していきます
詳細は下記の記事をご参考ください
(実行コマンド)
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 が使えるようになりました
参考記事
Discussion