Red Hat Enterprise Linux 8にPythonをインストールする
Red Hat Enterprise Linux 8(以下 RHEL 8) ではデフォルトで Python がインストールされていないことがあります。 AWS EC2 の Quick Start で提供されている AMI 「Red Hat Enterprise Linux 8 (HVM), SSD Volume Type」がまさにそのような例です。
$ python
がcommand not found
となって頭を抱えてしまった人向けに、RHEL 8 での Python のインストール方法を紹介します。
3行まとめ
- RHEL 8 では
/usr/bin/{python,python2,python3}
が存在しないことがある - Pythonをインストールするには
$ sudo yum install @python36
または$ sudo yum install @python27
を実行 $ /usr/bin/python
を特定の Python に向けるには$ sudo alternatives --config python
を実行
検証環境
AWS EC2 の RHEL Quick Start で提供されている、次の AMI を利用して検証しました。
- RHEL-8.0.0_HVM-20190426-x86_64-1-Hourly2-GP2 (ami-02fc41eea185ef7b2)
システム向けとユーザー向けで Python を分離
RHEL 8 では システムが利用する Python とユーザーが利用する Python が分離されました。
これにより
- システムとユーザーが異なる Python バージョンを利用できる
- システムが利用するライブラリとユーザーが利用するライブラリが競合しない
といったメリットを享受できるようになります。
システム向け Python は /usr/libexec/platform-python
にインストールされており、 実際 YUM の shebang はこの Python を指しています。
$ head -n 1 /usr/bin/yum #!/usr/libexec/platform-python
この Python のバージョンは 3.6.8 です。
ユーザー向け Python はインストールされていない
ユーザー向けにはどの Python が インストールされているのか気になるところですが、ベースイメージにより、どのバージョンもインストールされていないことがあります。
このようなケースでは、 python/python2/python2.7/python3 といったコマンドはことごとく command not found になるため、ユーザーが Python をバージョン指定してインストールする必要があります。
$ python -bash: python: command not found $ python2 -bash: python2: command not found $ python2.7 -bash: python2.7: command not found $ python3 -bash: python3: command not found
RHEL 8 の GA と前後して公開された、公式ブログから引用します。
TL;DR Of course we have Python! You just need to specify whether you want Python 3 or 2 as we didn’t want to set a default. Give yum install python3 and/or yum install python2 a try. Or, if you want to see what packages we recommend, use yum install @python36 or yum install @python27. Read on for why.
What, no Python in Red Hat Enterprise Linux 8? - Red Hat Developer Blog
YUM で Python をインストール
サクッとインストール
なにか Python がインストールされていれば OK な場合、2系/3系を指定して yum インストールしてください。
$ sudo yum install python2 $ sudo yum install python3
Application Streams でパッケージをインストール
RHEL 8 のお作法に則って Python をインストールしたい場合、今後主流となる Application Streams を利用しましょう。アプリケーション単発のインストールではなく、周辺ツールを含めたインストールやバージョン指定でのアプリケーション群のインストールが可能になります。
Introducing Application Streams in RHEL 8 - Red Hat Developer Blog
Amazon Linux 2 で言うところの Amazon Linux Extras ですね。
AppStream で提供されているストリーム一覧は $ sudo yum module list
で確認可能です。
Python 系に限定して確認してみます。
$ sudo yum module list | grep ^python Name Stream Profiles Summary ... python27 2.7 [d] common [d] Python programming language, version 2.7 python36 3.6 [d][e] common [d] [i], build Python programming language, version 3.6 ... Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled $ sudo yum module info python36 --profile Last metadata expiration check: 0:51:27 ago on Wed 08 May 2019 03:00:35 PM UTC. Name : python36:3.6:8000020190410133122:593c47b3:x86_64 common : python36 build : python36 : python36-devel : python36-rpm-macros
ストリーム python36 には、その下位カテゴリーとしてデフォルトの common と build の 2 つのプロフィール が提供されていることがわかります。
Application Streams を利用してインストールするには $ sudo yum install @AppStreamName
または $ sudo yum install @AppStreamName/ProfileName
とします。
$ sudo yum install @python36 # => デフォルトのプロフィールを利用 $ sudo yum install @python36/build # => build プロフィールを利用
実際に build プロフィールをインストールし、インストールされていることを確認します。
$ sudo yum install @python36/build ... $ sudo yum module list python36 Last metadata expiration check: 0:56:46 ago on Wed 08 May 2019 08:23:22 PM UTC. Red Hat Enterprise Linux 8 for x86_64 - AppStream from RHUI (RPMs) Name Stream Profiles Summary python36 3.6 [d][e] common [d], build [i] Python programming language, version 3.6 Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
build [i]
の [i] からインストールされていることがわかります。
ようやく $ pytho3
や python3.6
で Python3 を呼び出せるようになりました。
一方で、バージョンを指定しない $ python
は command not found
のままです。次のステップでこの問題を解決します。
インストールした Python を /usr/bin/python に向ける
互換性などのために、#!/usr/bin/python
のようにバージョンを指定せずに Python を呼び出した場合、先程インストールした Python 3.6 が呼び出されるようにしてみます。
設定は alternatives
コマンドで行います。
詳細は $ man unversioned-python
を確認ください。
$ sudo alternatives --config python # インタラクティヴに設定 There are 3 programs which provide 'python'. Selection Command ----------------------------------------------- *+ 1 /usr/libexec/no-python 2 /usr/bin/python2 3 /usr/bin/python3 Enter to keep the current selection[+], or type selection number: 3 # 入力 $ ls -l /usr/bin/python lrwxrwxrwx. 1 root root 36 May 8 21:11 /usr/bin/python -> /etc/alternatives/unversioned-python $ python -V Python 3.6.8
PEP 394 -- The "python" Command on Unix-Like Systems によると、バージョン指定のない python は python2 と同じダーゲットとするよう記載されていますが、この PEP が時代にそぐわなくなってきていることは Python コアディベロッパーも重々承知しています。
一般ユーザーは現実に合わせて柔軟に対応すればよいかと思います。
Python 2.7 の EOL
Python 2系最後の 2.7 は、機能追加はとうの昔に終了しており、現在はほそぼそとセキュリティ・バグ系のメンテナンスリリースが行われているだけです。そのメンテナンスリリースも、2020年1月を最後にリリースされなくなる予定です。
2019/05/09 時点 の Red Hat Software Collections Product Life Cycle では、Python 2.7 Life Extension の Retirement Date は 2020年4月に設定されています。
速やかに Python 3 系に移行しましょう。
きっかけ
RHEL 8 が 2019/05/08 にリリースされ、AWS EC2 コンソールでは最新の 8 がデフォルトになりました。 バージョンをよく確認せずに RHEL を起動し、結果として RHEL 8 には Python がインストールされていないことを知りました。
Python 行方不明問題含め、RHEL 8 の大きな変更点は公式のリリースブログにまとめられています。ぜひ、ご一読ください。
Red Hat Enterprise Linux 8 now generally available - Red Hat Developer Blog
Python に限定しても 3 本もあります。
- What, no Python in Red Hat Enterprise Linux 8? - Red Hat Developer Blog @ 2019/05/07
- Python in RHEL 8 - Red Hat Developer Blog @2018/11/14
- Hello World - Python on RHEL 8 | Red Hat Developer @ 2018/11/07
それでは
参考
- Red Hat Enterprise Linux 8 now generally available - Red Hat Developer Blog
- What, no Python in Red Hat Enterprise Linux 8? - Red Hat Developer Blog
- Python in RHEL 8 - Red Hat Developer Blog
- Hello World - Python on RHEL 8 | Red Hat Developer
- Introducing Application Streams in RHEL 8 - Red Hat Developer Blog
- Red Hat Enterprise Linux 8 のPython事情 - 赤帽エンジニアブログ