Amazon Linux2 には、Pythonがデフォルトで入っています
ただ、開発環境とバージョンが異なる場合、入れなおす必要があるため、
その方法をご紹介します
現状を確認しよう
Python
デフォルトでは、Python 2.7.10 がインストールされています
1 2 |
[ec2-user@ip-×××-××-××-×× ~]$ python -V Python 2.7.18 |
Python3 と指定すると 3.7.10 がインストールされています
1 2 |
[ec2-user@ip-×××-××-××-×× ~]$ python3 -V Python 3.7.10 |
また、Extras Library にあれば、amazon-linux-extras コマンドでインストールできます
1 2 |
[ec2-user@ip-×××-××-××-×× ~]$ amazon-linux-extras list | grep python 44 python3.8 available [ =stable ] |
→ Python3.8 は、インストールできます
pip
pipとは、Python のパッケージ管理ツールのことです。
pip はありませんが、pip3 はあります
1 2 3 4 |
[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 つけて実行しています
(実行コマンド)
1 2 3 |
python3.8 -V #python3.8 がないことの確認 sudo amazon-linux-extras install python3.8 -y python3.8 -V #バージョンが表示されればOK |
(実行結果)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[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 をインストールします
各コマンドの詳細は下記をご参考ください
(実行コマンド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 |
(実行結果)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
[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 のバージョンを確認すると、
デフォルトと変わりませんので、ご注意ください
1 2 3 4 |
[ec2-user@ip-×××-××-××-×× ~]$ python -V Python 2.7.18 [ec2-user@ip-×××-××-××-×× ~]$ python3 -V Python 3.7.10 |
pip
Python3を入れた段階で一緒にインストールされます
(Python3.8 をインストールした場合)
1 2 |
[ec2-user@ip-×××-××-××-×× ~]$ pip3.8 --version pip 21.0.1 from /usr/lib/python3.8/site-packages/pip (python 3.8) |
(Python3.9 をインストールした場合)
1 2 |
[ec2-user@ip-×××-××-××-×× ~]$ pip3.9 --version pip 22.0.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9) |
ちなみに、まだpip コマンドは使用できません
1 2 |
[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の場合
(実行コマンド)
1 2 3 4 5 |
echo 'alias python=python3.8' >> ~/.bashrc echo 'alias pip=pip3.8' >> ~/.bashrc source ~/.bashrc python -V pip --version |
(実行結果)
1 2 3 4 5 6 7 |
[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の場合
(実行コマンド)
1 2 3 4 5 |
echo 'alias python=python3.9' >> ~/.bashrc echo 'alias pip=pip3.9' >> ~/.bashrc source ~/.bashrc python -V pip --version |
(実行結果)
1 2 3 4 5 6 7 |
[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 コマンドを使用します
1 2 3 4 5 6 7 8 |
[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 にたどりつくため、
1 2 |
[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 コマンドで確認します
1 2 3 4 |
[ec2-user@ip-×××-××-××-×× ~]$ which python3.8 /usr/bin/python3.8 [ec2-user@ip-×××-××-××-×× ~]$ which python3.9 /usr/local/bin/python3.9 |
また、python3のパスを確認すると、
1 2 3 4 5 6 |
[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 コマンドを使用して参照先を変更していきます
詳細は下記の記事をご参考ください
(実行コマンド)
1 |
sudo ln -nfs /usr/bin/python3 /usr/bin/python |
※ec2-user なので、sudo つけて実行します
(実行結果)
1 2 3 4 5 6 7 |
[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の場合
1 |
sudo ln -nfs /usr/bin/python3.8 /usr/bin/python3 |
・python3.9の場合
1 |
sudo ln -nfs /usr/local/bin/python3.9 /usr/bin/python3 |
(実行結果)
・python3.8の場合
1 2 3 4 5 6 7 |
[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の場合
1 2 3 4 5 6 7 |
[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コマンドで調べてもないよーと返ってきます
1 2 3 4 |
[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 のパスを調べました
1 2 3 4 |
[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
1 |
sudo ln -nfs /usr/bin/pip3.8 /usr/bin/pip |
・pip3.9
1 |
sudo ln -nfs /usr/local/bin/pip3.9 /usr/bin/pip |
(実行結果)
・pip3.8
1 2 3 4 5 6 7 |
[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
1 2 3 4 5 6 7 |
[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 が使えるようになりました
参考記事
コメント