ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

RHELやCentOSなどでPython 3を使う

Python 3の環境をCentOS 7で作るのは大変と聞いたのでブログにまとめようと思いました。

Python 3環境をLinuxで作るんだったら迷わず FedoraUbuntuopenSUSEをオススメします。これらは比較的新しいパッケージを提供するためです。

ただし、どうしてもRed Hat Enterprise LinuxとかCentOSyumコマンドでインストール/アップデートできないと嫌なんですけど...という人には、「Software Collections」をオススメしたいと思います。

Software Collectionsについてはここら辺にまとまっています。簡単に言うと、システムに影響を与えることなくRHELRHELクローン上でシステム標準パッケージよりも新しいバージョンを使えるような仕組みです。便利ではあるのですが、割とご存じない人が多いみたいですね。

access.redhat.com

その他

使い方

例えばPython 3.5を例にすると「Python 3.5 by Software Collections」の手順通りです。その他のパッケージは検索してみてください。Software Collectionは定期的に新しいバージョンに更新されるので、サイトの情報よりも新しいパッケージが提供されている場合もあります。

ちなみに2017年3月2日現在はPython 3.3、3.4、3.5がインストールできるようです。

ディストリビューション別の導入方法

Software CollectionsをRHELRHELクローンで使う方法です。代表的なものをいくつか取り上げます。

Red Hat Enterprise Linux 7
$ sudo yum-config-manager --enable rhel-server-rhscl-7-rpms
CentOS 7
$ sudo yum install centos-release-scl
Scientific Linux 7
$ sudo yum install http://ftp1.scientificlinux.org/linux/scientific/7x/external_products/softwarecollections/yum-conf-softwarecollections-2.0-1.el7.noarch.rpm
Oracle Linux 7

Public YumにSCLがあるのでおそらく使えると思います。

[2017/10/19追記]

1.5 Installing the Software Collection Library Utility From the Oracle Linux Yum Server

CentOS 7で実際に使ってみた

インストールします。

$ sudo yum install rh-python35

もともとはPython 2.7.5が入っているようです。

$ python -V
Python 2.7.5

シェルを切り替えてpythonを叩くと、今度はPython 3.5.1が呼ばれることがわかります。 Software Collectionsによりインストールされるバイナリーは大抵/optの下にインストールされます。 シェルを切り替えずにメインのシェルで動かすにはそのパスを叩けば良いですが、決して/usr/bin/pythonを張り替えて「yumが動かない!」とか言わないでください。動かない原因を作ったのはあなたですからw

$ scl enable rh-python35 bash
$ python -V
Python 3.5.1
$ which python
/opt/rh/rh-python35/root/usr/bin/python

[2017/10/19追記]

SCLでインストールしたパッケージは/optに展開されるので、次のように実行することでシェルの切り替えをすることなく、Python 3を使うことができるようになるそうです。

Permanently Enable a Software Collection - RHD Blog

例えばPython 3.3の場合は

source /opt/rh/python33/enable

これを.bashrcに書けば起動ごとにアクセス可能になるとか。

いつもの「こんにちは世界」でも動かしますか。

$ echo 'print("Hello world!")' > hello.py
$ python hello.py
Hello world!

print文はカッコで閉じるんですよ。