Red Hat Training

A Red Hat training course is available for RHEL 8

15.4. Empaquetado de RPMs de Python 3

La mayoría de los proyectos de Python utilizan Setuptools para el empaquetado, y definen la información del paquete en el archivo setup.py. Para más información sobre el empaquetado de Setuptools, consulte la documentación de Setuptools.

También puedes empaquetar tu proyecto Python en un paquete RPM, que proporciona las siguientes ventajas en comparación con el empaquetado de Setuptools:

  • Especificación de las dependencias de un paquete con otros RPM (incluso los que no son de Python)
  • Firma criptográfica

    Con la firma criptográfica, el contenido de los paquetes RPM puede ser verificado, integrado y probado con el resto del sistema operativo.

15.4.1. Descripción del archivo SPEC para un paquete Python

Un archivo SPEC contiene instrucciones que la utilidad rpmbuild utiliza para construir un RPM. Las instrucciones se incluyen en una serie de secciones. Un archivo SPEC tiene dos partes principales en las que se definen las secciones:

  • Preámbulo (contiene una serie de metadatos que se utilizan en el cuerpo)
  • Cuerpo (contiene la parte principal de las instrucciones)

Para más información sobre los archivos SPEC, consulte Empaquetado y distribución de software.

Un archivo RPM SPEC para proyectos de Python tiene algunas especificidades en comparación con los archivos RPM SPEC que no son de Python. En particular, el nombre de cualquier paquete RPM de una biblioteca de Python debe incluir siempre el prefijo que determina la versión, por ejemplo, python3 para Python 3.6 o python38 para Python 3.8.

En el siguiente archivo SPEC se muestran otros datos específicos example for the python3-detox package. Para la descripción de estos detalles, consulte las notas debajo del ejemplo.

%global modname detox                                                           1

Name:           python3-detox                                                   2
Version:        0.12
Release:        4%{?dist}
Summary:        Distributing activities of the tox tool
License:        MIT
URL:            https://pypi.io/project/detox
Source0:        https://pypi.io/packages/source/d/%{modname}/%{modname}-%{version}.tar.gz

BuildArch:      noarch

BuildRequires:  python36-devel                                                  3
BuildRequires:  python3-setuptools
BuildRequires:  python36-rpm-macros
BuildRequires:  python3-six
BuildRequires:  python3-tox
BuildRequires:  python3-py
BuildRequires:  python3-eventlet

%?python_enable_dependency_generator                                            4

%description

Detox is the distributed version of the tox python testing tool. It makes efficient use of multiple CPUs by running all possible activities in parallel.
Detox has the same options and configuration that tox has, so after installation you can run it in the same way and with the same options that you use for tox.

    $ detox

%prep
%autosetup -n %{modname}-%{version}

%build
%py3_build                                                                      5

%install
%py3_install

%check
%{__python3} setup.py test                                                      6

%files -n python3-%{modname}
%doc CHANGELOG
%license LICENSE
%{_bindir}/detox
%{python3_sitelib}/%{modname}/
%{python3_sitelib}/%{modname}-%{version}*

%changelog
...
1
La macro modname contiene el nombre del proyecto Python. En este ejemplo es detox.
2
Cuando se empaqueta un proyecto Python en RPM, el prefijo python3 siempre debe añadirse al nombre original del proyecto. El nombre original aquí es detox y el name of the RPM es python3-detox.
3
BuildRequires especifica qué paquetes son necesarios para construir y probar este paquete. En BuildRequires, incluya siempre los elementos que proporcionan las herramientas necesarias para construir paquetes de Python: python36-devel y python3-setuptools. El paquete python36-rpm-macros es necesario para que los archivos con /usr/bin/python3 shebangs se cambien automáticamente a /usr/bin/python3.6. Para más información, consulte Sección 15.4.4, “Manejo de hashbangs en scripts de Python”.
4
Cada paquete de Python requiere algunos otros paquetes para funcionar correctamente. Dichos paquetes deben especificarse también en el archivo SPEC. Para especificar el dependencies, puede utilizar la macro %python_enable_dependency_generator para utilizar automáticamente las dependencias definidas en el archivo setup.py. Si un paquete tiene dependencias que no se especifican usando Setuptools, especifíquelas dentro de las directivas adicionales Requires.
5
Las macros %py3_build y %py3_install ejecutan los comandos setup.py build y setup.py install, respectivamente, con argumentos adicionales para especificar las ubicaciones de instalación, el intérprete a utilizar y otros detalles.
6
La sección check proporciona una macro que ejecuta la versión correcta de Python. La macro %{__python3} contiene una ruta para el intérprete de Python 3, por ejemplo /usr/bin/python3. Recomendamos utilizar siempre la macro en lugar de una ruta literal.