第7章 Python 3 RPM のパッケージ化
DNF パッケージマネージャーを使用すると、システムに Python パッケージをインストールできます。DNF は RPM パッケージ形式を使用します。これにより、ソフトウェアのダウンストリーム制御が強化されます。
Python プロジェクトを RPM パッケージにパッケージ化すると、ネイティブ Python パッケージと比較して次の利点が得られます。
- DNF パッケージマネージャーは、Python パッケージおよび Python 以外のパッケージへの依存関係を可能にし、それらを厳密に管理します。
- パッケージに暗号で署名できます。暗号化署名を使用すると、RPM パッケージのコンテンツを、オペレーティングシステムの他の部分を使用して検証、統合、およびテストできます。
- ビルドプロセス中にテストを実行できます。
ネイティブ Python パッケージのパッケージ形式は、Python Packaging Authority (PyPA) 仕様 によって定義されています。歴史的に、ほとんどの Python プロジェクトでは、パッケージ化に distutils または setuptools ユーティリティーを使用し、setup.py ファイルでパッケージ情報を定義していました。ただし、ネイティブ Python パッケージ作成の可能性は、時間の経過とともに進化しています。
-
setup.pyファイルを使用する Python ソフトウェアをパッケージ化するには、このドキュメントに従ってください。 -
pyproject.tomlファイルを使用してより新しいパッケージをパッケージ化するには、pyproject-rpm-macros のREADMEファイルを参照してください。pyproject-rpm-macrosは、サポート対象外のパッケージを含む CodeReady Linux Builder (CRB) リポジトリーに含まれており、より新しい Python パッケージング標準への対応のために時間の経過とともに変更される可能性があることに注意してください。
7.1. Python パッケージの例に対する spec ファイルの説明 リンクのコピーリンクがクリップボードにコピーされました!
python3-pello パッケージの以下の例にある、Python RPM 仕様 ファイルの詳細に関する注記を確認してください。
Python プロジェクトの RPM 仕様 ファイルには、Python 以外の RPM 仕様 ファイルと比較していくつかの特有の点があります。たとえば、Python ライブラリーの RPM パッケージ名には、python3- という 接頭辞を含めることが推奨されます。
例7.1 Python で書かれたプログラムの SPEC ファイルの例
%global python3_pkgversion 3
Name: python-pello
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
# Build dependencies need to be specified manually
BuildRequires: python%{python3_pkgversion}-setuptools
# Test dependencies need to be specified manually
# 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
Summary: %{summary}
%description -n python%{python3_pkgversion}-pello %_description
%prep
%autosetup -p1 -n Pello-%{version}
%build
# The macro only supports projects with setup.py
%py3_build
%install
# The macro only supports projects with setup.py
%py3_install
%check
%pytest
# Note that there is no %%files section for python-pello
%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/
-
python3_pkgversionマクロを定義することで、このパッケージがビルドされる Python バージョンを設定します。デフォルトの Python バージョン3.12用にビルドするには、行を削除します。 -
Python プロジェクトを RPM にパッケージ化するときは、常に
python-接頭辞をプロジェクトの元の名前に追加してください。ここでは元の名前がPelloであるため、ソース RPM (SRPM) の名前はpython-pelloになります。 -
BuildRequiresは、このパッケージのビルドおよびテストに必要なパッケージを指定します。BuildRequiresには、Python パッケージのビルドに必要なツールを提供するアイテムpython3-develと、パッケージ化する特定のソフトウェアに必要な関連プロジェクト (python3-setuptools、または%checkセクションでテストを実行するのに必要なランタイムとテストの依存関係) を常に含めます。 -
バイナリー RPM (ユーザーがインストールできるパッケージ) の名前を選択する際には、バージョン管理された Python 接頭辞を追加します。デフォルトの Python 3.12 の場合は、
python3-接頭辞を使用します。%{python3_pkgversion}マクロを使用できます。このマクロは、デフォルトの Python バージョン3.12に対して3と評価されます。ただし、たとえば、より新しいバージョンの Python が利用可能な場合など、明示的にバージョンを指定すればその値に設定されます (脚注 1 を参照)。 %py3_buildマクロおよび%py3_installマクロは、インストール場所、使用するインタープリター、その他の詳細を指定する追加の引数を使用して、setup.py buildコマンドおよびsetup.py installコマンドをそれぞれ実行します。注記setuptoolsパッケージのsetup.py buildコマンドとsetup.py installコマンドの使用は非推奨となり、今後の RHEL メジャーリリースでは削除される予定です。代わりに pyproject-rpm-macros を使用できます。-
%checkセクションでは、パッケージ化されたプロジェクトのテストを実行します。正確なコマンドはプロジェクト自体によって異なりますが、%pytestマクロを使用して、RPM に適した方法でpytestコマンドを実行できます。