Python in RedHat Enterprise Linux 8

**2019-05-19追記: RHEL 8.0 Final release version から、python のライブラリインストール構造が改善されたようです。コメントにて情報をいただいています。**
**この記事の内容は古くなっていることに注意してください。**


この記事は、[富士通ソーシアルサイエンスラボラトリ Advent Calendar](https://qiita.com/advent-calendar/2018/ssl) 12日目の記事です。
初投稿でして、お作法がよろしくないところはご指摘ください。

## RedHat Enterprise Linux 8 来たる

RedHat Enterprise Linux 8、RHEL 8 の beta 版がリリースされました。
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8-beta/html-single/8.0_beta_release_notes/index

拾い読みでも結構変化があることがわかります。

> RHEL 8 provides the following database servers: MariaDB 10.3, MySQL 8.0, PostgreSQL 10, PostgreSQL 9.6, and Redis 4.0. 

データベース周りでは MariaDB, PostgreSQL などが大きくバージョンアップします。

> On Red Hat Enterprise Linux 8, installing software is ensured by the new version of the YUM tool, which is based on the DNF technology. 

yum は DNF ベースのバージョンに置きかわります(使い方は変わらないとのこと)。

そして、
> Python 3.6 is the default Python implementation in RHEL 8; limited support for Python 2.7 is provided.  

python は 3.6 が標準に！ python 2.7 は限定サポートへ。

python のアップデートに関しては RedHat の開発者ブログで取り上げられていたので、この記事ではその内容をざっと追ってみたいと思います(現時点の beta 版に基づく内容であることをご承知おきください)。
https://developers.redhat.com/blog/2018/11/14/python-in-rhel-8/

## 過去の歴史

開発者ブログに入る前に簡単におさらいです。
python はバージョン 2 と 3 の間に非互換があり、RHEL は yum など OS 自身のシステムツールが python 2 を使用してたこと、安定志向の設計であることから python 3 はこれまで標準のバージョンとして採用されませんでした。

開発時には [Anaconda](https://www.anaconda.com/) などの python の専用環境を使用することも多く、その場合には OS 側のバージョンの制約を受けませんが、そういった環境作成が必須となるとコンテナなどの作業環境の軽快さを損なうことにもなります。

多くのライブラリなどが python 3 に対応してきた現状を考えると、やはり python 3 がデフォルトで使用できるほうが便利と言えるでしょう。

## Using Python in RHEL 8

さて、開発者ブログの Using Python in RHEL 8 のセクションでは以下のことが書かれています。

* python を未インストールの場合、`yum install python3`のようにインストールする必要がある。
* 標準でバージョンなしの **python コマンドは存在しない**。 `yum install python3` または  `yum install python2` のように **バージョンを明示する**。
* なぜかというと、開発者の文脈依存の判断では python として実行した際に 2 と受け取る人と 3 と受け取る人の両方が存在しているから。
* `alternatives --set python /usr/bin/python3` のように python コマンドをいずれかのバージョンで実行するように設定は可能であるが、この方法は **推奨しない** 。理由は対象が python コマンドのみで、 `yum install python-requests` や `pip`コマンドは　alternatives のバージョン指定に対応しないため。
* pip, venv といったコマンドに頼らないこと。代わりに `python3 -m pip`, `python3 -m venv`, `python2 -m virtualenv` などを使用する。

## Third-party packages

python の開発時には何らかのライブラリを使用することは良くあり、サードパーティパッケージのセクションでは、ライブラリの導入について述べられています。

* 導入方法として(ネットで検索すると必ず書いてある) `sudo pip install` は **絶対に行わないこと！**
* RHEL 8 は多くの部分で Python 3.6 に依存しているので、`sudo pip`は **システムを壊す** と心得ること。
* `python3 -m venv --system-site-packages myenv` のように python の仮想環境を使用するか、pip の `--user` スイッチを使用し yum などのシステムツールに影響を与えないようにします。
* システム全体(全ユーザー)で使用する場合には **RPM パッケージをつくって**、yum install しましょう。

## Platform-Python: The Python behind the curtain

何となく怪しい感じになってきましたが、「システムを壊す」の背景の説明があります。

* python は標準で入っているわけではないのに、yum などのシステムツールが動作するのは、どんな魔法で可能なのか?
* “Platform-Python”を使ってシステムツールは動いています。これはユーザー用の python 3 とは別ですが、ディスク容量節約のためユーザー用の python 3.6 とライブラリは共有しています。
* ユーザーアプリで“Platform-Python”を使わないこと。システムツールを開発するなら“Platform-Python”を使うこと。

## Porting to Python 3

省略します。今時アプリは pyhton 3 で開発しましょう。

## Takeaways

* python を使うときは　`python3`と明示しよう。
* Do not use `sudo pip`.
* python 2 のコードがあるなら近代化する良い機会です(前向き)。

## 所感

いや〜これ、
「〇〇の環境つくっといて」
「できました！」
「なんか動きおかしい、なにしたの?」
「sudo pip hogehoge しときました」
「RHEL 8 では御法度や」
って**絶対なりますよね?**

**今から目に浮かぶわ**

少し真面目に考えると、

* rpm が提供されている場合は、yum でインストール
* それ以外は --user でインストール

というあたりが、とりあえず手間と安全性のバランスが良さそうな気がします。

RHEL 8 では python 3 が気軽に使えるという記事にするつもりだったのですが。。
正式リリース時にはこの記事が無駄になることを祈ります。