5.5. Python 3 RPM のパッケージ化

Python パッケージは、pip インストーラーを使用してアップストリームの PyPI リポジトリーから、または DNF パッケージマネージャーを使用してシステムにインストールできます。DNF は RPM パッケージ形式を使用します。これにより、ソフトウェアのダウンストリーム制御が強化されます。

ネイティブ Python パッケージのパッケージ形式は、Python Packaging Authority (PyPA) 仕様 によって定義されています。ほとんどの Python プロジェクトでは、パッケージ化に distutils または setuptools ユーティリティーを使用し、setup.py ファイルでパッケージ情報を定義しています。ただし、ネイティブ Python パッケージ作成の可能性は、時代とともに進化してきています。新しいパッケージング標準の詳細は、pyproject-rpm-macros を参照してください。

この章では、setup.py を使用する Python プロジェクトを RPM パッケージにパッケージ化する方法を説明します。このアプローチには、ネイティブ Python パッケージと比較して次の利点があります。

  • Python および Python 以外のパッケージへの依存が可能です。依存関係は DNF パッケージマネージャーによって厳密に適用されます。
  • パッケージに暗号で署名できます。暗号化署名を使用すると、RPM パッケージのコンテンツを、オペレーティングシステムの他の部分を使用して検証、統合、およびテストできます。
  • ビルドプロセス中にテストを実行できます。

5.5.1. Python パッケージ用の SPEC ファイルの説明

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

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

Python プロジェクトの RPM SPEC ファイルには、非 Python RPM SPEC ファイルと比較していくつかの詳細があります。

重要

Python ライブラリーの RPM パッケージの名前には、常に python3- または python3.11- の接頭辞が含まれている必要があります。

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

Python で書かれた pello プログラムの SPEC ファイルサンプル

%global python3_pkgversion 3.11                                       1

Name:           python-pello                                          2
Version:        1.0.2
Release:        1%{?dist}
Summary:        Example Python library

License:        MIT
URL:            https://github.com/fedora-python/Pello
Source:         %{url}/archive/v%{version}/Pello-%{version}.tar.gz

BuildArch:      noarch
BuildRequires:  python%{python3_pkgversion}-devel                     3

# Build dependencies needed to be specified manually
BuildRequires:  python%{python3_pkgversion}-setuptools

# Test dependencies needed to be specified manually
# Also runtime dependencies need to be BuildRequired manually to run tests during build
BuildRequires:  python%{python3_pkgversion}-pytest >= 3


%global _description %{expand:
Pello is an example package with an executable that prints Hello World! on the command line.}

%description %_description

%package -n python%{python3_pkgversion}-pello                         4
Summary:        %{summary}

%description -n python%{python3_pkgversion}-pello %_description


%prep
%autosetup -p1 -n Pello-%{version}


%build
# The macro only supported projects with setup.py
%py3_build                                                            5


%install
# The macro only supported projects with setup.py
%py3_install


%check                                                                6
%{pytest}


# Note that there is no %%files section for the unversioned python module
%files -n python%{python3_pkgversion}-pello
%doc README.md
%license LICENSE.txt
%{_bindir}/pello_greeting

# The library files needed to be listed manually
%{python3_sitelib}/pello/

# The metadata files needed to be listed manually
%{python3_sitelib}/Pello-*.egg-info/

1
python3_pkgversion マクロを定義することで、このパッケージがビルドされる Python バージョンを設定します。デフォルトの Python バージョン 3.9 用にビルドするには、マクロをデフォルト値 3 に設定するか、その行を完全に削除します。
2
Python プロジェクトを RPM にパッケージ化するときは、常に python- 接頭辞をプロジェクトの元の名前に追加してください。ここでの元の名前は pello であるため、ソース RPM (SRPM) の名前 は、python-pello になります。
3
BuildRequires は、このパッケージのビルドおよびテストに必要なパッケージを指定します。BuildRequires には、Python パッケージのビルドに必要なツールを提供するアイテム python3-devel (または python3.11-devel) と、パッケージ化する特定のソフトウェアに必要な関連プロジェクト python3-setuptools (または python3.11-setuptools)、あるいは %check セクションでテストを実行するために必要なランタイムとテストの依存関係を常に含めます。
4
バイナリー RPM (ユーザーがインストールできるパッケージ) の名前を選択する際には、バージョン管理された Python 接頭辞を追加します。デフォルトの Python 3.9 には python3- 接頭辞を、Python 3.11 には python3.11- 接頭辞を使用します。%{python3_pkgversion} マクロを使用できます。これは、明示的なバージョン (3.11 など) に設定しない限り、デフォルトの Python バージョン 3.9 の場合は 3 と評価されます(脚注 1 を参照)。
5
%py3_build マクロおよび %py3_install マクロは、インストール場所、使用するインタープリター、その他の詳細を指定する追加の引数を使用して、setup.py build コマンドおよび setup.py install コマンドをそれぞれ実行します。
6
%check セクションは、パッケージ化されたプロジェクトのテストを実行する必要があります。正確なコマンドはプロジェクト自体に依存しますが、%pytest マクロを使用して、RPM に適した方法で pytest コマンドを実行することができます。

5.5.2. Python 3 RPM の一般的なマクロ

SPEC ファイルでは、値をハードコーディングするのではなく、以下の Python 3 RPM のマクロ の表で説明されているマクロを常に使用します。SPEC ファイルの上に python3_pkgversion マクロを定義することで、これらのマクロで使用する Python 3 バージョンを再定義できます( 「Python パッケージ用の SPEC ファイルの説明」 を参照)。python3_pkgversion マクロを定義すると、以下の表で説明されているマクロの値は、指定された Python 3 バージョンを反映します。

表5.3 Python 3 RPM 用のマクロ

マクロ一般的な定義説明

%{python3_pkgversion}

3

他のすべてのマクロで使用される Python バージョン。Python 3.11 を使用するために 3.11 に再定義できます。

%{python3}

/usr/bin/python3

Python3 インタープリター

%{python3_version}

3.9

Python3 インタープリターの major.minor バージョン

%{python3_sitelib}

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

pure-Python モジュールがインストールされている場所

%{python3_sitearch}

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

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

%py3_build

 

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

%py3_install

 

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

%{py3_shebang_flags}

s

Python インタープリターディレクティブマクロのデフォルトのフラグセット %py3_shebang_fix

%py3_shebang_fix

 

Python インタープリターディレクティブを #! %{python3} に変更すると、既存のフラグ (見つかった場合) を保持し、%{py3_shebang_flags} マクロで定義されたフラグを追加します。

5.5.3. Python RPM の自動生成された依存関係の使用

次の手順では、Python プロジェクトを RPM としてパッケージ化するときに自動生成された依存関係を使用する方法を説明します。

前提条件

手順

  1. アップストリームで提供されるメタデータを含む次のディレクトリーのいずれかが、結果の RPM に含まれていることを確認します。

    • .dist-info
    • .egg-info

      RPM ビルドプロセスは、これらのディレクトリーから仮想 pythonX.Ydist Provides を自動的に生成します。次に例を示します。

      python3.9dist(pello)

      次に、Python 依存関係ジェネレーターはアップストリームメタデータを読み取り、生成された pythonX.Ydist 仮想 Provides を使用して各 RPM パッケージのランタイム要件を生成します。たとえば、生成された要件タグは次のようになります。

      Requires: python3.9dist(requests)
  2. 生成された require を検査します。
  3. 生成された require の一部を削除するには、次のいずれかの方法を使用します。

    1. SPEC ファイルの %prep セクションでアップストリーム提供のメタデータを変更します。
    2. アップストリームドキュメント で説明されている依存関係の自動フィルタリングを使用します。
  4. 自動依存関係ジェネレーターを無効にするには、メインパッケージの %description 宣言の上に %{?python_disable_dependency_generator} マクロを含めます。