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 を使用するために |
%{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 パッケージに適した引数で | |
%py3_install |
RPM パッケージに適した引数で | |
%{py3_shebang_flags} | s |
Python インタープリターディレクティブマクロのデフォルトのフラグセット |
%py3_shebang_fix |
Python インタープリターディレクティブを |
5.5.3. Python RPM の自動生成された依存関係の使用
次の手順では、Python プロジェクトを RPM としてパッケージ化するときに自動生成された依存関係を使用する方法を説明します。
前提条件
- RPM の SPEC ファイルが存在する。詳細は、Python パッケージの SPEC ファイルの説明 を参照してください。
手順
アップストリームで提供されるメタデータを含む次のディレクトリーのいずれかが、結果の RPM に含まれていることを確認します。
-
.dist-info
.egg-info
RPM ビルドプロセスは、これらのディレクトリーから仮想
pythonX.Ydist
Provides を自動的に生成します。次に例を示します。python3.9dist(pello)
次に、Python 依存関係ジェネレーターはアップストリームメタデータを読み取り、生成された
pythonX.Ydist
仮想 Provides を使用して各 RPM パッケージのランタイム要件を生成します。たとえば、生成された要件タグは次のようになります。Requires: python3.9dist(requests)
-
- 生成された require を検査します。
生成された require の一部を削除するには、次のいずれかの方法を使用します。
-
SPEC ファイルの
%prep
セクションでアップストリーム提供のメタデータを変更します。 - アップストリームドキュメント で説明されている依存関係の自動フィルタリングを使用します。
-
SPEC ファイルの
-
自動依存関係ジェネレーターを無効にするには、メインパッケージの
%description
宣言の上に%{?python_disable_dependency_generator}
マクロを含めます。