6.5. 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 패키지의 콘텐츠를 나머지 운영 체제와 검증, 통합 및 테스트할 수 있습니다.
- 빌드 프로세스 중에 테스트를 실행할 수 있습니다.
6.5.1. Python 패키지에 대한 SPEC 파일 설명 링크 복사링크가 클립보드에 복사되었습니다!
SPEC 파일에는 rpmbuild 유틸리티가 RPM을 빌드하는 데 사용하는 지침이 포함되어 있습니다. 지침은 여러 섹션에 포함되어 있습니다. SPEC 파일에는 섹션이 정의된 두 가지 주요 부분이 있습니다.
- Preamble (본문에 사용되는 일련의 메타데이터 항목 포함)
- 본문(명령의 주요 부분 포함)
Python 프로젝트의 RPM SPEC 파일에는 Python이 아닌 SPEC 파일에 비해 몇 가지 구체적인 내용이 있습니다.
Python 라이브러리의 RPM 패키지 이름에는 항상 python3-, python3.11- 또는 python3.12- 접두사가 포함되어야 합니다.
기타 세부 사항은 python3*-pello 패키지에 대한 다음 SPEC 파일 예제에 표시되어 있습니다. 이러한 세부 사항에 대한 설명은 예제 아래의 노트를 참조하십시오.
Python으로 작성된 프로그램에 대한 사양 파일의 예
%global python3_pkgversion 3.12
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 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
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
%install
# The macro only supported projects with setup.py
%py3_install
%check
%{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/
%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 1.0.2-1
- First pello package
- 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.12-devel)과 같은 특정 소프트웨어에 필요한 관련 패키지 (예:python3-setuptools또는) 또는python3.11-setuptools%check섹션에서 테스트를 실행하는 데 필요한 런타임 및 테스트 종속 항목을 포함합니다.- 4
- 바이너리 RPM의 이름(사용자가 설치할 수 있는 패키지)을 선택할 때 버전 지정된 Python 접두사를 추가합니다. 기본 Python 3.9, Python 3.11용
python3.11-접두사 또는 Python 3.12용python3.12-접두사에python3-접두사를 사용합니다. 명시적 버전으로 설정하지 않는 한 기본 Python 버전 3.9에 대해3으로 평가되는%{python3_pkgversion}매크로를 사용할 수 있습니다(예:3.11참조). - 5
%py3_build및%py3_install매크로는 설치 위치, 사용할 인터프리터 및 기타 세부 정보를 지정하는 추가 인수와 함께setup.py build및setup.py install명령을 각각 실행합니다.- 6
%check섹션은 패키지된 프로젝트의 테스트를 실행해야 합니다. 정확한 명령은 프로젝트 자체에 따라 다르지만%pytest매크로를 사용하여 RPM에 친숙한 방식으로pytest명령을 실행할 수 있습니다.
6.5.2. Python 3 RPM의 일반적인 매크로 링크 복사링크가 클립보드에 복사되었습니다!
SPEC 파일에서는 항상 값을 하드 코딩하지 않고 다음 Macros for Python 3 RPMs 테이블에 설명된 매크로를 사용합니다. SPEC 파일 상단에 python3_pkgversion 매크로를 정의하여 이러한 매크로에서 어떤 Python 3 버전이 사용되는지 확인할 수 있습니다( 6.5.1절. “Python 패키지에 대한 SPEC 파일 설명”참조). python3_pkgversion 매크로를 정의하는 경우 다음 표에 설명된 매크로 값은 지정된 Python 3 버전을 반영합니다.
| macro | 일반 정의 | 설명 |
|---|---|---|
| %{python3_pkgversion} | 3 |
다른 모든 매크로에서 사용하는 Python 버전입니다. Python |
| %{python3} | /usr/bin/python3 | Python 3 인터프리터 |
| %{python3_version} | 3.9 | Python 3 인터프리터의 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 인터프리터 지시문을 |
6.5.3. Python RPM에 자동 생성된 종속 항목 사용 링크 복사링크가 클립보드에 복사되었습니다!
다음 절차에서는 Python 프로젝트를 RPM으로 패키징할 때 자동으로 생성된 종속 항목을 사용하는 방법을 설명합니다.
사전 요구 사항
- RPM용 SPEC 파일이 있습니다. 자세한 내용은 Python 패키지에 대한 SPEC 파일 설명을 참조하십시오.
절차
업스트림 제공 메타데이터가 포함된 다음 디렉터리 중 하나가 결과 RPM에 포함되어 있는지 확인합니다.
-
.dist-info .egg-infoRPM 빌드 프로세스는 다음과 같이 이러한 디렉터리에서 제공하는 가상
pythonX.Ydist를 자동으로 생성합니다.python3.9dist(pello)그런 다음 Python 종속성 생성기는 업스트림 메타데이터를 읽고 생성된
pythonX.Ydist가상 기능을 사용하여 각 RPM 패키지에 대한 런타임 요구 사항을 생성합니다. 예를 들어 생성된 요구 사항 태그는 다음과 같을 수 있습니다.Requires: python3.9dist(requests)
-
- 생성된 요구 사항을 검사합니다.
생성된 요구 중 일부를 제거하려면 다음 방법 중 하나를 사용합니다.
-
SPEC 파일의
%prep섹션에서 업스트림 제공 메타데이터를 수정합니다. - 업스트림 설명서에 설명된 종속성을 자동 필터링하여 사용합니다.
-
SPEC 파일의
-
자동 종속성 생성기를 비활성화하려면 기본 패키지의
%description선언 위에%{?python_disable_dependency_generator}매크로를 포함합니다.