第6章 Red Hat Enterprise Linux 8 での Python の使用

6.1. Python の概要

Python は、オブジェクト指向、命令、機能、手順などの複数のプログラミングパラダイムをサポートする高レベルのプログラミング言語です。Python は動的なセマンティクスを持ち、汎用プログラミングに使用できます。

Red Hat Enterprise Linux では、システムツールを提供するパッケージ、データ分析または Web アプリケーションのツールなど、システムにインストールされている多くのパッケージは、Python で記述されています。このパッケージを使用できるようにするには、python パッケージがインストールされている必要があります。

6.1.1. Python のバージョン

Python で互換性のない 2 つのバージョン (Python 2.x および Python 3.x) が広く使用されています。

Red Hat Enterprise Linux 8 では、デフォルトで Python 3.6 を使用しますが、既存ソフトウェアをサポートするために Python 2.7 も提供されています。

警告

デフォルトの python パッケージまたはバージョンを指定しない /usr/bin/python 実行ファイルは、いずれも Red Hat Enterprise Linux 8 では配布されません。

重要

Python のインストール時、起動時、対話時にはメジャーバージョンを常に指定します。たとえば、パッケージ名またはコマンド名で、python の代わりに python3 を使用します。Python 関連のすべてのコマンドにもバージョンを含む必要があります (pip3pip2 など)。

もしくは、「バージョンを指定しない Python の設定」 の説明に従って alternatives コマンドを使用して、システムのデフォルトバージョンを設定します。

以下の理由により、システム管理者は Python 3 を使用することが推奨されます。

  • Python 3 は、Python プロジェクトの主な開発方向を表します。
  • アップストリームコミュニティーの Python 2 のサポートは 2020 年に終了します。
  • アップストリームで人気のある Python ライブラリーでは、Python 2 サポートが減っています。
  • Python 3 への移行を容易にするために、Red Hat Enterprise Linux 8 の Python 2 のライフサイクルは短くなっています。

開発者には、Python 2 と比較して Python 3 には以下の利点があります。

  • Python 3 の方が、より簡単に、表現が豊かで、メンテナンスが可能な、正しいコードを書くことができます。
  • Python 3 で書かれたコード寿命は長くなります。
  • Python 3 には、asyncio、f-strings、高度なアンパッキング、キーワードのみの引数、例外チェーンなどの新機能があります。

ただし、既存のソフトウェアでは、/usr/bin/python が Python 2 であることが求められる傾向があります。この理由により、デフォルトでは、python パッケージが配信されている Red Hat Enterprise Linux 8 で配信され、「バージョンを指定しない Python の設定」 に記載されるように、/usr/bin/python で、使用する Python のバージョンを 2 または 3 から選択できます。

6.1.2. 内部プラットフォームの python パッケージ

Red Hat Enterprise Linux 8 のシステムツールは、内部の platform-python パッケージで提供される Python バージョン 3.6 を使用します。Red Hat は、代わりに python36 パッケージを使用することを推奨します。

6.2. Python のインストールおよび使用

警告

バージョンを指定しない python コマンドを使用して Python をインストールまたは実行すると曖昧なためデフォルトでは動作しません。「Python 3 のインストールおよび使用」および「Python 2 のインストールおよび使用」の説明に従って、Python のメジャーバージョンを常に指定します。「バージョンを指定しない Python の設定」 の説明に従って、alternatives コマンドを使用して、システムのデフォルトバージョンを設定します。

6.2.1. Python 3 のインストールおよび使用

Red Hat Enterprise Linux 8 では、Python 3 は、AppStream リポジトリーの python36 モジュールとして配信されます。

モジュールの詳細は 『Application Stream の使用』 を参照してください。

6.2.1.1. Python 3 のインストール

Python 3 をインストールするには、root で以下のコマンドを実行します。

yum install python3

このコマンドは、AppStream の python36 から Python 3.6 をインストールします。

6.2.1.2. Python 3 の使用

Python 3 を実行するには、python3 コマンドを実行します。その他のすべての関連コマンドでこのバージョンを使用します (例: pip3)。

6.2.1.3. Python 3 パッケージの命名規則

Python 3 用のアドオンモジュールのパッケージは、通常、接頭辞 python3- を使用します。

たとえば、HTTP クライアントを書き込むために使用される Requests モジュールをインストールするには、以下のコマンドを実行します。

yum install python3-requests

6.2.2. Python 2 のインストールおよび使用

一部のソフトウェアは Python 3 に完全には移植されておらず、動作するのに Python 2 が必要となります。Red Hat Enterprise Linux 8 では、Python 3 と Python 2 を同時にインストールできます。Python 2 機能が必要な場合は python27 モジュールをインストールしてください。これは AppStream リポジトリーで利用できます。

モジュールの詳細は 『Application Stream の使用』 を参照してください。

警告

Python 3 は、Python プロジェクトの主な開発方針です。Python 2 のサポートは終了しつつあります。python27 モジュールは、Red Hat Enterprise Linux 8 でのサポート期間が短くなります。

6.2.2.1. Python 2 のインストール

Python 2 をインストールするには、root で以下のコマンドを実行します。

yum install python2

このコマンドは、AppStream の python27 から Python 2.7 をインストールします。

6.2.2.2. Python 2 の使用

Python 2 を実行するには、python2 コマンドを実行します。その他のすべての関連コマンドでこのバージョンを使用します (例: pip2)。

6.2.2.2.1. Python 2 パッケージの命名規則

Python 2 用のアドオンモジュールのパッケージは、通常、接頭辞 python2- を使用します。

たとえば、HTTP クライアントを書き込むために使用される Requests モジュールをインストールするには、以下のコマンドを実行します。

yum install python2-requests

6.2.3. バージョンを指定しない Python の設定

システム管理者は、alternatives コマンドを使用して、バージョンを管理しない python コマンドを設定できます。必要なパッケージ (python3 または python2) は、バージョンを指定しないコマンドを各バージョンに設定する前にインストールする必要があります。

バージョンを指定しない python コマンドを Python 3 に直接設定するには、以下のコマンドを実行します。

alternatives --set python /usr/bin/python3

Python 2 を選択した場合は類似コマンドを使用してください。

もしくは、対話式に、バージョンを指定しない python コマンドを設定できます。

  1. 次のコマンドを実行します。

    alternatives --config python
  2. 表示された一覧から必要なバージョンを選択します。

この設定をリセットし、バージョンを指定しない python をコマンドを削除するには、以下のコマンドを実行します。

alternatives --auto python
警告

その他の Python 関連のコマンド (pip3) には、バージョンを指定しないで設定可能なバリアントがあります。

6.3. Python 2 から Python 3 への移行

開発者は、Python 2 で記述したコードを Python 3 に移行できます。大規模なコードベースを Python 3 に移行する方法は 「The Conservative Python 3 Porting Guide」 を参照してください。

この移行が終了すると、元の Python 2 コードは Python 3 インタープリターにより解釈できるようになり、同様に Python 2 インタープリターは解釈できるままとなることに注意してください。

6.4. Python 3 RPM のパッケージング

ほとんどの Python プロジェクトは、パッケージングに Setuptools を使用して、setup.py ファイルにパッケージ情報を定義します。Setuptools パッケージングの詳細は Setuptools ドキュメント を参照してください。

Python プロジェクトを RPM パッケージにパッケージ化することもできます。これには、Setuptools パッケージングと比較して以下の以下の利点があります。

  • (Pythonでなくても) その他の RPM のパッケージの依存関係の指定
  • 電子署名

    電子署名を使用すると、RPM パッケージの内容は、オペレーティングシステムのその他の部分とともに検証、統合、およびテストできます。

RPM パッケージングの詳細は、『RPM Packaging Guide』 を参照してください。

6.4.1. Python RPM パッケージ用の典型的な SPEC ファイルの説明

SPEC ファイルには、RPM を構築するために rpmbuild ユーティリティーが使用する命令が含まれています。命令は、一連のセクションに含まれています。SPEC ファイルには、セクションが定義されている 2 つの主要部分があります。

  • プリアンブル (ボディーに使用されている一連のメタデータ項目が含まれています)
  • ボディー (命令の主要部分が含まれています)

SPEC ファイルの詳細は 『RPM Packaging Guide』 を参照してください。

Python プロジェクトの RPM SPEC ファイルには、非 Python RPM SPEC ファイルと比較していくつかの詳細があります。中でも注目すべきは、Python ライブラリーの RPM パッケージの名前に、python3 接頭辞が常に指定されている必要があるということです。

その他の詳細は、次の SPEC ファイルの python3-detox パッケージの例 に記載されています。その詳細の説明は、例の下に記載されている注意事項を参照してください。

%global modname detox                                                           1

Name:           python3-detox                                                   2
Version:        0.12
Release:        4%{?dist}
Summary:        Distributing activities of the tox tool
License:        MIT
URL:            https://pypi.io/project/detox
Source0:        https://pypi.io/packages/source/d/%{modname}/%{modname}-%{version}.tar.gz

BuildArch:      noarch

BuildRequires:  python36-devel                                                  3
BuildRequires:  python3-setuptools
BuildRequires:  python36-rpm-macros
BuildRequires:  python3-six
BuildRequires:  python3-tox
BuildRequires:  python3-py
BuildRequires:  python3-eventlet

%?python_enable_dependency_generator                                            4

%description

Detox is the distributed version of the tox python testing tool. It makes efficient use of multiple CPUs by running all possible activities in parallel.
Detox has the same options and configuration that tox has, so after installation you can run it in the same way and with the same options that you use for tox.

    $ detox

%prep
%autosetup -n %{modname}-%{version}

%build
%py3_build                                                                      5

%install
%py3_install

%check
%{__python3} setup.py test                                                      6

%files -n python3-%{modname}
%doc CHANGELOG
%license LICENSE
%{_bindir}/detox
%{python3_sitelib}/%{modname}/
%{python3_sitelib}/%{modname}-%{version}*

%changelog
...
1
modname マクロは、Python プロジェクトの名前が含まれます。この例では detox となります。
2
Python プロジェクトを RPM にパッケージ化する場合は、常にプロジェクトの元の名前に接頭辞 python3 を追加する必要があります。ここでの元の名前は detox で、RPM の名前python3-detox です。
3
BuildRequires は、このパッケージのビルドおよびテストに必要なパッケージを指定します。BuildRequires では、Python パッケージをビルドするのに必要なツールを提供する項目 (python36-devel および python3-setuptools) が常に含まれます。/usr/bin/python3 shebangs があるファイルが自動的に /usr/bin/python3.6 に変更されるようにするには、python36-rpm-macros パッケージが必要です。詳細は 「Python スクリプトにおける hashban の処理」 を参照してください。
4
すべての Python パッケージが正しく動作するためには、その他のパッケージがいくつか必要です。このようなパッケージも、SPEC ファイルで指定する必要があります。依存関係 を指定するには、%python_enable_dependency_generator マクロを使用して、setup.py ファイルに定義した依存関係を自動的に使用できます。パッケージに、Setuptools で指定していない依存関係がある場合は、追加の Requires ディレクティブ内に指定します。
5
%py3_build マクロおよび %py3_install マクロは、setup.py build コマンドおよび setup.py install コマンドを実行します。
6
check セクションは、Python の正しいバージョンを実行するマクロを提供します。%{__python3} マクロには、Python 3 インタープリターのパス (/usr/bin/python3 など) が含まれます。リテラルパスではなく、マクロを使用することが常に推奨されます。

6.4.2. Python 3 RPM パッケージ用の一般的なマクロ

SPEC ファイルでは、常にその値をハードコーディングするのではなく、以下のマクロを使用します。

マクロ名では、バージョンを指定しない python ではなく、python3 または python2 を使用してください。

マクロ一般的な定義説明

%{__python3}

/usr/bin/python3

Python 3 のインタープリター

%{python3_version}

3.6

Python 3 インタープリターのフルバージョン

%{python3_sitelib}

/usr/lib/python3.6/site-packages

pure Python モジュールのインストール先

%{python3_sitearch}

/usr/lib64/python3.6/site-packages

アーキテクチャー固有の拡張を含むモジュールがインストールされている場合

%py3_build

 

システムパッケージに適した引数で setup.py build コマンドを実行します。

%py3_install

 

システムパッケージに適した引数で setup.py install コマンドを実行します。

6.4.3. Python RPM パッケージの自動 Provides

Python プロジェクトをパッケージ化する際、以下のディレクトリーが存在する場合は、結果の RPM に含まれます。

  • .dist-info
  • .egg-info
  • .egg-link

このディレクトリーから、RPM ビルドプロセスは自動的に仮想 pythonX.Ydist Provides (python3.6dist(detox) など) を生成します。この仮想 Provides は、%python_enable_dependency_generator マクロにより指定されるパッケージにより提供されます。

6.4.4. Python スクリプトにおける hashban の処理

Red Hat Enterprise Linux 8 では、実行可能な Python スクリプトが、主な Python バージョンを明示的に指定する hashbang (shebangs) を使用することを期待します。

/usr/lib/rpm/redhat/brp-mangle-shebangs BRP (buildroot policy) スクリプトは、RPM パッケージを構築する際に自動的に実行され、実行可能なすべてのファイルで hashbang を修正します。BRP スクリプトは、以下のようにあいまいな hashbang で Python スクリプトが発生すると、エラーが作成されます。

#! /usr/bin/python

または

#! /usr/bin/env python

Python スクリプトで、RPM ビルド時にエラーが発生する hashbang を修正するには、platform-python-devel パッケージの pathfix.py スクリプトを使用します。

pathfix.py -pn -i %{__python3} PATH …​

複数の PATH を指定できます。PATH がディレクトリーの場合、pathfix.py は Python スクリプトを再起的にスキャンして、^[a-zA-Z0-9_]+\.py$ パターンに一致するものを探します。これは、あいまいな hashbang があるものだけではありません。このコマンドを %prep セクション、または %install セクションに追加します。

別の方法として、パッケージ化した Python スクリプトを、期待されるフォーマットに準拠するように変更します。この目的のために、pathfix.py は、RPM ビルドプロセス以外でも使用できます。pathfix.py を RPM ビルド以外で実行する場合は、上述の例の __python3 を、hashbang のパス (/usr/bin/python3 など) に置き換えます。

パッケージ化した Python スクリプトに Python バージョン 2 が必要な場合は、上記コマンドで 3 を 2 に置き換えます。

また、/usr/bin/python3 の形式での hashbang は、Red Hat Enterprise Linux を使用するシステムツールに使用される platform-python の Python を示す hashbang にデフォルトで置き換えられます。

カスタムパッケージで /usr/bin/python3 hashbang を変更して、/usr/bin/python3.6 の形式で、Application Stream からインストールする Python のバージョンを指定するには、SPEC ファイルの BuildRequires セクションに python36-rpm-macros パッケージを追加します。

BuildRequires:  python36-rpm-macros
注記

BRP スクリプトが hashbang の確認と修正を行わないようにするには、以下の RPM ディレクティブを使用します。

%undefine %brp_mangle_shebangs