Edited at

【Python2to3アップデート方法】Python3系のインストール


目次


概要

Python2系を3系にアップデートする手順や、バージョンについて説明する。


インストール方法

ここでは、以下の3つのインストール方法を紹介する。

方法
version
備考

CentOS:7.5にyumでインストール
3.6
yumでは3.6までしかインストールできない

ubuntu:18.04にapt-getでインストール
3.7
apt-get-で3.7をインストール可能

ソースファイルをコンパイルしてインストール
3.7
-


CentOS7にyumで3.6をインストール

CentOS7のyumでは、Python3.6が最新なので3.6をインストールする。


レポジトリを追加

iusから取得する場合(3.6.7がインストールされる)

$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm

epelから取得する場合(3.6.6がインストールされる)

$ sudo yum install -y epel-release


インストール

iusから取得する場合

$ sudo yum install -y python36u python36u-libs python36u-devel python36u-pip

============================================================================================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================================================================================
Installing:
python36u x86_64 3.6.7-1.ius.centos7 ius 57 k
python36u-devel x86_64 3.6.7-1.ius.centos7 ius 839 k
python36u-libs x86_64 3.6.7-1.ius.centos7 ius 8.9 M
python36u-pip noarch 9.0.1-1.ius.centos7 ius 1.8 M
Installing for dependencies:
python36u-setuptools noarch 39.0.1-1.ius.centos7 ius 642 k

Transaction Summary
============================================================================================================================================================================================================
Install 4 Packages (+1 Dependent package)

epelから取得する場合

$ sudo yum install -y --enablerepo=epel python36 python36-libs python36-devel python36-pip

============================================================================================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================================================================================
Installing:
python36 x86_64 3.6.6-5.el7 epel 66 k
python36-devel x86_64 3.6.6-5.el7 epel 850 k
python36-libs x86_64 3.6.6-5.el7 epel 8.5 M
python36-pip noarch 8.1.2-8.el7 epel 1.6 M
Installing for dependencies:
dwz x86_64 0.11-3.el7 centos-base 99 k
perl-srpm-macros noarch 1-8.el7 centos-base 4.6 k
python-rpm-macros noarch 3-23.el7 epel 7.7 k
python-srpm-macros noarch 3-23.el7 epel 7.2 k
python3-rpm-macros noarch 3-23.el7 epel 6.8 k
python36-setuptools noarch 39.2.0-3.el7 epel 631 k
redhat-rpm-config noarch 9.1.0-87.el7.centos centos-base 81 k

Transaction Summary
============================================================================================================================================================================================================
Install 4 Packages (+7 Dependent packages)

以降、iusからダウンロードした場合の例です。epelもだいたい同じですが、多少インストールされるものに違いがあります。

インストールすると、python関連のコマンドが以下のように増える。

python3.6mとは、--with-pymallocオプションが設定されたもの。

pymallocについては、こちらを参照。

$ ls -1 /usr/bin/* | grep python

/usr/bin/python
/usr/bin/python2
/usr/bin/python2.7
/usr/bin/python3
/usr/bin/python36
/usr/bin/python3.6
/usr/bin/python3.6-config
/usr/bin/python3.6m
/usr/bin/python3.6m-config
/usr/bin/python3.6m-x86_64-config
/usr/bin/python3-config


シンボリックリンクを貼る

pythonコマンドでpython3.6を実行できるようにする。

$ sudo ln -s /usr/bin/python3.6 /usr/local/bin/python

$ python --version
Python 3.6.7


pipについて

python36u-pipをインストールした直後では、pipコマンドはpip3.6のみが存在している。

iusの場合

$ which pip3.6

/usr/bin/pip3.6

epelの場合

$ which pip3.6

/usr/local/bin/pip3.6

pip3.6コマンドを実行すると、pipをupgradeしろと出るのでupgradeする。

You are using pip version 9.0.1, however version 19.0.3 is available.

You should consider upgrading via the 'pip install --upgrade pip' command.

$ sudo pip3.6 install --upgrade pip

そうすると、pipコマンドが以下の3つに増える。

-rwxr-xr-x 1 root root 218 Apr 18 01:54 /usr/bin/pip

-rwxr-xr-x 1 root root 218 Apr 18 01:54 /usr/bin/pip3
-rwxr-xr-x 1 root root 218 Apr 18 01:54 /usr/bin/pip3.6

ただし、全て同じ場所を参照しているようなので、全て同じだと思われる。

$ python3.6 -m pip -V

pip 19.0.3 from /usr/lib/python3.6/site-packages/pip (python 3.6)
$ pip -V
pip 19.0.3 from /usr/lib/python3.6/site-packages/pip (python 3.6)
$ pip3 -V
pip 19.0.3 from /usr/lib/python3.6/site-packages/pip (python 3.6)
$ pip3.6 -V
pip 19.0.3 from /usr/lib/python3.6/site-packages/pip (python 3.6)


python36とpython36uの違い

ちなみに、yum searchをすると分かるが、python36python36uの2つのパッケージが用意されている。この2つの違いについて調べてみた。

$ sudo yum search yum search python36

python36.x86_64 : Interpreter of the Python programming language
python36u.x86_64 : Interpreter of the Python programming language

python36uとは一体なんなのか調べてみた。


EPELの後発であるIUSが独自の基準で選んだpythonのリビジョンやらがEPELと違うので同じpackage nameだと不都合だからuをつけたんだろう


CentOS python3 package difference between python36 and python36u


python36u is an alternative build provided by IUS; python36 is an EPEL package.

yum info python36 python36u will show you different repos for the two, and it's likely that the IUS one has a slightly higher minor version number than the EPEL package.


結論としては、提供元が違うだけで、大きな差はなさそう。


Ubuntuのapt-getで3.7をインストール

ちなみに、Ubuntuではあまり動作確認していません。


Python3.7のインストール

$ sudo apt-get install python3.7


pip3のインストール

$ sudo apt-get install python3-pip


ソールファイルをコンパイルして3.7インストール

CentOS7.5でPython3.7をインストールするには、OpenSSL1.02以上が必要となる。

(Python3.6をインストールする場合は現行のversionでOK)

現行もversionでPythonのインストールを続けると、コンパイル時に以下のように、ssl moduleをbuildできないというログが出力される。

Could not build the ssl module!

Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

現行のopensslのversionを調べてみると、1.0.2が入っているように見えるが、これでは駄目なようだ。

yum install -y openssl-develをしても結果は変わらなかった。

$ rpm -qa | grep openssl

openssl-libs-1.0.2k-8.el7.x86_64

そのため、OpenSSL1.1.1をインストールすることにする。


OpenSSL-1.0.2は2019-12-31にEOL

また、1.0.2は2019-12-31にEOLなようなので、1.1.1を入れることにする。

https://www.openssl.org/policies/releasestrat.html


The next version of OpenSSL will be 3.0.0.

Version 1.1.1 will be supported until 2023-09-11 (LTS).

Version 1.1.0 will be supported until 2019-09-11.

Version 1.0.2 will be supported until 2019-12-31 (LTS).

Version 1.0.1 is no longer supported.

Version 1.0.0 is no longer supported.

Version 0.9.8 is no longer supported.



OpenSSLのインストール

OpenSSL1.1.1を入れます。以下を参考にしてインストールしてください。

「OpenSSLを共有ライブラリに追加する」も実施してください。(実施しないとpipが使えません。)

参考:CentOS7にOpenSSL1.1.1をインストール

ちなみに、既存のOpenSSLは残したまま、別途1.1.1をインストールするし、Pythonの./configureオプションで1.1.1のライブラリパスを指定するインストール方法を実施する。


依存関係のインストール

以下をインストールする。

$ sudo yum -y install zlib \

tk-devel \
tcl-devel \
ncurses-devel \
gdbm-devel \
readline-devel \
zlib-devel \
bzip2-devel \
sqlite-devel \
openssl-devel \
libXext.x86_64 \
libSM.x86_64 \
libXrender.x86_64 \
gcc \
gcc-c++ \
libffi-devel \
python-devel \
patch \
bzip2 \
make

matplotlib使うなら下記もインストールする。

後から追加した場合、Pythonのリビルドが必要となる。

$ sudo yum install -y tk.x86_64 tk-devel.x86_64 tkinter.x86_64


Pythonのダウンロード

以下からインストールするversionを選ぶ。

https://www.python.org/

ここでは3.7をインストールする。

$ sudo curl https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz -o /usr/local/src/Python-3.7.3.tgz


Pythonのインストール

--with-openssl=/usr/local/openssl-1.1.1で先程インストールしたOpenSSLのパスを指定する。

--with-ensurepipを付けることでpip3もインストールする。

--enable-optimizationsを付けると、11%ほどパフォーマンスが上がるらしい。ただし、makeにすごく時間がかかる。

$ cd /usr/local/src

$ sudo tar xvfz Python-3.7.3.tgz
$ cd Python-3.7.3
$ sudo ./configure --enable-unicode=ucs4 \
--prefix=/usr/local \
--with-openssl=/usr/local/openssl-1.1.1 \
--with-ensurepip \
--enable-optimizations
$ sudo make
$ sudo make altinstall


make altinstallについて

https://docs.python.org/ja/3/using/unix.html#building-python


警告 make install は python3 バイナリを上書きまたはリンクを破壊してしまうかもしれません。そのため、make install の代わりに exec_prefix/bin/pythonversion のみインストールする make altinstall が推奨されています。



インストールされたことを確認

以下にインストールされる。

$ sudo ls -l /usr/local/bin/

total 24644
-rwxr-xr-x 1 root root 101 Apr 17 11:22 2to3-3.7
-rwxr-xr-x 1 root root 241 Apr 17 11:22 easy_install-3.7
-rwxr-xr-x 1 root root 99 Apr 17 11:22 idle3.7
-rwxr-xr-x 1 root root 223 Apr 17 11:22 pip3.7
-rwxr-xr-x 1 root root 84 Apr 17 11:22 pydoc3.7
-rwxr-xr-x 2 root root 12603000 Apr 17 11:22 python3.7
-rwxr-xr-x 2 root root 12603000 Apr 17 11:22 python3.7m
-rwxr-xr-x 1 root root 3105 Apr 17 11:22 python3.7m-config
-rwxr-xr-x 1 root root 441 Apr 17 11:22 pyvenv-3.7


shebangについて

shebangの書き方だが、大きく分けて以下の2つがある。


#!/usr/bin/python

こちらは、/usr/bin/pythonをインタプリタとして定義している。逆に言うと、/usr/bin/pythonが存在していない場合はエラーとなる。


#!/usr/bin/env python

こちらは、PATHので定義されているディレクトリのどこかにpythonが存在していれば、それを採用する。複数pythonが存在している場合は、PATHで定義されている順番に依存する。PATHの内容は以下で確認。

$ echo $PATH

参考: 「#!/usr/bin/python」と「#!/usr/bin/env python」の違い


参考