Compilaciones complejas de paquetes de Python#

Esta guía se centra en paquetes que solamente utilizan Python o que tienen unas pocas extensiones simples en otro lenguaje como C o C++.

For comprehensive guidance on packaging compiled projects with C/C++/Fortran/Rust extensions, see the Scientific Python Development Guide on compiled packaging. This is the best reference for complex builds and covers scikit-build-core, meson-python, maturin, and other modern build backends.

If you have questions about these types of package, please open an issue about this guide specifically in the GitHub repo for this guide. There are many nuances to building and distributing Python packages that have compiled extensions requiring non-Python dependencies at build time. For an overview and thorough discussion of these nuances, please see this site.

Pure Python packages vs. packages with extensions in other languages#

Se puede clasificar la complejidad de los paquetes de Python en tres categorías. Estas categorías, a su vez, pueden ayudarlo a seleccionar las mejores herramientas de frontend y backend.

  1. Paquetes de Python puros: son paquetes que solo dependen de Python para funcionar. Construir un paquete de Python puro es más simple. Como tal, puede elegir una herramienta a continuación que tenga las características que desea sin tener que considerar muchos detalles.

  2. Paquetes de Python con extensiones en otros lenguajes: Estos paquetes tienen componentes adicionales llamados extensiones escritas en otros lenguajes (como C o C++). Si tiene un paquete con extensiones no escritas en otros lenguajes, debe seleccionar una herramienta de backend de compilación que permita pasos de compilación adicionales necesarios para compilar su código en estos lenguajes. Además, si desea utilizar una herramienta de frontend para ayudar a su flujo de trabajo, deberá seleccionar una herramienta que admita configuraciones de compilación adicionales. Sugerimos que elija una herramienta de compilación que admita pasos de compilación personalizados como por ejemplo Hatch.

  3. Paquetes de Python que tienen extensiones escritas en diferentes lenguajes (por ejemplo, Fortran y C++) o que tienen dependencias no escritas en Python que son difíciles de instalar (por ejemplo, GDAL): Estos paquetes a menudo tienen pasos de compilación complejos (más complejos que un paquete con solo algunas extensiones en C, por ejemplo). Como tal, estos paquetes requieren herramientas como scikit-build o meson-python para construir. NOTA: puede usar meson-python con PDM.

Mezclar proyectos de frontend y backend#

A veces es necesario o deseable usar un frontend de compilación con un backend de compilación alternativo. Esto se debe a que algunos frontends no tienen un backend predeterminado (build), y esta elección recae en el mantenedor. Otros backends (hatch) tienen un backend preferido (hatchling) pero permiten al mantenedor migrar a otro, mientras que algunos backends (poetry) solo funcionan con un solo backend (poetry-core). Consulte (#python-package-build-tools) para obtener más información sobre la compatibilidad de frontend y backend.

En esta guía de empaquetado, recomendamos usar hatch junto con su backend preferido hatchling. Si bien esto será adecuado para la mayoría de los paquetes, se puede usar un backend alternativo con Hatch si es necesario al crear un módulo de extensión. Un módulo de extensión de Python es uno que está compuesto, ya sea en parte o en su totalidad, de código compilado en otro lenguaje. En este caso, el backend elegido (como meson-python) debe saber cómo compilar el lenguaje de extensión y vincularlo a Python. hatchling no sabe cómo hacer esto por sí solo y debe hacer uso de plugins o cambiar un backend que sea capaz de construir módulos de extensión.

Para usar un backend diferente, deberá editar el pyproject.toml de su proyecto. Si tiene un pyproject.toml generado por el comando hatch, o siguiendo el tutorial de empaquetado, probablemente tendrá hacer un cambio como este

 [build-system]
-requires = ["hatchling"]
+requires = ["meson-python"]
-build-backend = "hatchling.build"
+build-backend = "mesonpy"