3장. Python 3 RPM 패키징

pip 설치 프로그램을 사용하거나 DNF 패키지 관리자를 사용하여 업스트림 PyPI 리포지토리에서 시스템에 Python 패키지를 설치할 수 있습니다. DNF는 소프트웨어에 대한 다운스트림 제어를 제공하는 RPM 패키지 형식을 사용합니다.

네이티브 Python 패키지의 패키징 형식은 Python Packaging Authority (PyPA) 사양으로 정의됩니다. 대부분의 Python 프로젝트는 패키징에 distutils 또는 setuptools 유틸리티를 사용하고 setup.py 파일에서 정의된 패키지 정보를 사용합니다. 그러나 기본 Python 패키지를 만들 가능성이 시간이 지남에 따라 발전했습니다. 새로운 패키징 표준에 대한 자세한 내용은 pyproject-rpm-macros 를 참조하십시오.

이 장에서는 setup.py 를 RPM 패키지로 사용하는 Python 프로젝트를 패키징하는 방법을 설명합니다. 이 방법은 네이티브 Python 패키지와 비교하여 다음과 같은 이점을 제공합니다.

  • Python 및 비 Python 패키지에 대한 종속 항목을 사용할 수 있으며 DNF 패키지 관리자가 엄격하게 적용할 수 있습니다.
  • 패키지를 암호화 방식으로 서명할 수 있습니다. 암호화 서명을 사용하면 RPM 패키지의 콘텐츠를 나머지 운영 체제와 검증, 통합 및 테스트할 수 있습니다.
  • 빌드 프로세스 중에 테스트를 실행할 수 있습니다.

3.1. Python 패키지에 대한 SPEC 파일 설명

SPEC 파일에는 rpmbuild 유틸리티가 RPM을 빌드하는 데 사용하는 지침이 포함되어 있습니다. 지침은 여러 섹션에 포함되어 있습니다. SPEC 파일에는 섹션이 정의된 두 가지 주요 부분이 있습니다.

  • Preamble (본문에 사용되는 일련의 메타데이터 항목 포함)
  • 본문(명령의 주요 부분 포함)

Python 프로젝트의 RPM SPEC 파일에는 Python이 아닌 SPEC 파일에 비해 몇 가지 구체적인 내용이 있습니다.

중요

Python 라이브러리의 RPM 패키지 이름에는 항상 python3- 또는 python3.11- 접두사가 포함되어야 합니다.

기타 세부 사항은 python3*-pello 패키지에 대한 다음 SPEC 파일 예제에 표시되어 있습니다. 이러한 세부 사항에 대한 설명은 예제 아래의 노트를 참조하십시오.

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 이므로 Source RPM (SRPM)의 이름은 python-pello 입니다.
3
BuildRequires 는 이 패키지를 빌드하고 테스트하는 데 필요한 패키지를 지정합니다. BuildRequires 에서는 항상 python3-devel (또는 python3.11-devel)과 패키지하는 특정 소프트웨어에 필요한 관련 프로젝트 (예: python3-setuptools (또는 python3.11-setuptools) 또는 %check 섹션에서 테스트를 실행하는 데 필요한 런타임 및 테스트 종속성과 같은 Python 패키지 빌드에 필요한 툴을 제공하는 항목을 포함합니다.
4
바이너리 RPM의 이름(사용자가 설치할 수 있는 패키지)을 선택할 때 버전 지정된 Python 접두사를 추가합니다. 기본 Python 3.9에는 python3- 접두사 또는 Python 3.11의 경우 python3.11- 접두사를 사용합니다. %{python3_pkgversion} 매크로를 사용할 수 있습니다. 이 매크로는 명시적 버전(예: 3.11 참조)으로 설정하지 않는 한 기본 Python 버전 3.9에 대해 3 으로 평가됩니다.
5
%py3_build%py3_install 매크로는 각각 setup.py buildsetup.py install 명령을 실행하여 설치 위치, 사용할 인터프리터를 지정하는 추가 인수와 함께 실행합니다.
6
%check 섹션에서는 패키지 프로젝트의 테스트를 실행해야 합니다. 정확한 명령은 프로젝트 자체에 따라 달라지지만 %pytest 매크로를 사용하여 RPM 친화적인 방식으로 pytest 명령을 실행할 수 있습니다.