やらかした話
Amazon Linux は Red Hat Enterprise Linux (RHEL) をベースに開発された Linux ディストリビューションです*1。しかし、古い RHEL 5〜6 をベースにして、その後の開発は分岐しているため、パッケージ管理の方法などには違いがあります。
RHEL や CentOS では、EPEL を使って pip をインストールしても最新版にならず、pip install -U pip
(pip install --upgrade pip
) を実行する必要があります。
しかし Amazon Linux には独自の yum repository があるため、以下のように yum で最新版にアップデートできます。
$ sudo yum update python27-pip
しかし、それを忘れていて、Amazon Linux 上でつい
$ sudo pip install -U pip
としたところ、/usr/bin/pip が削除されて、新しい pip が /usr/local/bin/pip にインストールされてしまいました。ぐぐってみたら、同様の報告が Stack Overflow にもありました。
「もしかして、これって最新の RHEL や CentOS でも同じことになるんだろうか?」と思って、EC2 上で検証してみました。
検証結果
結果を先に言うと、RHEL や CentOS ではそうなりませんでした。
Amazon Linux AMI 2017.09.1
- 最新の pip が入っており、これ以上アップデートできない(Python 2.7.12, pip 9.0.1)
Amazon Linux AMI 2017.03.0
- Python 2.7.12, pip 6.1.1 がインストールされている
- pip は alternatives で管理されており、/usr/bin/pip は /etc/alternatives/pip へのシンボリックリンク
- pip install -U pip を実行すると、/usr/bin/pip は削除され、/usr/local/bin/pip にインストールされる
- yum update python27-pip でアップデートすれば /usr/bin/pip のままで pip 9.0.1 になる
Red Hat Enterprise Linux 7.4 (HVM), SSD Volume Type
- Python のバージョンは 2.7.5 で、pip はインストールされていない
- yum install epel-release で EPEL をインストールできず、rpm ファイルをダウンロードしてインストールする必要がある
- yum install python-pip で pip 8.1.2 がインストールされる
- インストール先は Amazon Linux と同じ /usr/bin/pip
- pip install -U pip を実行すると、パスは /usr/bin/pip のままで pip 9.0.1 にアップデートされる
CentOS 7 (x86_64) - with Updates HVM
- Python のバージョンは 2.7.5 で、pip はインストールされていない
- yum install epel-release で EPEL をインストールできる
- これ以降は RHEL と同じ
補足:現時点の最新バージョンは Python 2.7.14, pip 9.0.1
まとめ
結論としては、Amazon Linux では pip install -U pip しちゃ駄目ですが、他の Red Hat 系だと特に問題ない(むしろ yum では最新版が入らない)みたいです。Amazon Linux の pip は alternatives で管理されていることが影響しているんでしょうか?
Qiita で同様の症状がいくつか報告されていて、これらはどうも Amazon Linux ではなさそうですが、これ以上は深入りしないでおきます。
この件を Python に詳しい同僚に話したところ、yum が Python 2 で動作する関係で、RHEL や CentOS ではなかなか Python のバージョンを上げられないという事情もあるそうです。
pip は Python 3.4 以降に標準添付されていますが、RHEL や CentOS でその恩恵が受けられるのは当分先になりそうですね……。
おまけ(1):今回の検証に使った AMI
おまけ(2):そもそものきっかけ
今回そもそも何故 Amazon Linux で pip をアップデートしようとしたかというと、こんな経緯でした。
- Amazon Linux 上で Ansible 2.4.1 を使いたくなった
- Ansible 2.4.1 は cryptography に依存しているが、この cryptography が pip のバージョンアップを要求してきた
- 何も考えずに
sudo pip install -U pip
を実行した sudo pip install ansible==2.4.1.0
を実行したら/usr/bin/pip: そのようなファイルやディレクトリはありません
とか言われて真顔に
pyenv や virtualenv を使っていれば、今回みたいな目には遭わないと思います。Ansible で使いたいだけだから、と手抜きしたのがよくなかったですね。
Ansible が Python に依存してるせいで、ときどきどうでもいいところでつまづく気がします(今回のは完全に自業自得ですけど)。運用管理ツールを Go で作りたくなる人の気持ちが最近よくわかります……。
*1:AWS Developer Forums: Amazon Linux AMI - what distro is this based on? での Ben@AWS の回答によると、Amazon Linux は RHEL 5.x と、RHEL 6 の一部を元にしている。