Python tiene una confusa historia de las herramientas que se pueden utilizar para empaquetar y describir los proyectos: se completan distutils
en la librería estándar, distribute
, distutils2
, y setuptools
(y tal vez más). Parece que distribute
y distutils2
fueron descontinuados a favor de setuptools
, lo que deja dos estándares en competencia.
Según tengo entendido, setuptools
ofrece muchas más opciones (por ejemplo, declarar dependencias, pruebas, etc.) que distutils
, sin embargo, no está incluido en la biblioteca estándar de Python (¿todavía?).
La Guía del usuario de Python Packaging [ 1 ] recomienda ahora:
Úselo
setuptools
para definir proyectos y crear Distribuciones de origen.
Y explica:
Aunque puede usar puro
distutils
para muchos proyectos, no admite la definición de dependencias en otros proyectos y le faltan varias utilidades de conveniencia para completar automáticamente los metadatos del paquete proporcionados porsetuptools
. Al estar fuera de la biblioteca estándar, setuptools también ofrece un conjunto de características más consistente en diferentes versiones de Python, y (a diferencia dedistutils
),setuptools
se actualizará para producir los próximos formatos estándar "Metadata 2.0" en todas las versiones compatibles.Incluso para proyectos que eligen usar
distutils
, cuando pip instala dichos proyectos directamente desde la fuente (en lugar de instalarlos desde un archivo de rueda preconstruido), en realidad construirá su proyecto usandosetuptools
en su lugar.
Sin embargo, mirar los archivos setup.py de varios proyectos revela que esto no parece ser un estándar real. Todavía se usan muchos paquetes distutils
y los que admiten a setuptools
menudo se mezclan, setuptools
por distutils
ejemplo, haciendo una importación alternativa:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
Seguido de un intento de encontrar una manera de escribir una configuración que pueda ser instalada por ambos setuptools
y distutils
. Esto a menudo incluye varias formas de comprobación de dependencias propensas a errores, ya distutils
que no admite dependencias en la función de configuración.
¿Por qué la gente sigue haciendo un esfuerzo adicional para apoyar distutils
? ¿Es el hecho de que setuptools
no está en la biblioteca estándar la única razón? ¿Cuáles son las ventajas distutils
y los inconvenientes de escribir archivos setup.py que solo son compatibles setuptools
?
distutils
se ha fusionado nuevamentesetuptools
, pero hay aplicaciones heredadas que se escribieron para usardistutils
y hay costos involucrados para migrar a los estándares correctos.setuptools
es una alternativa mejorada,distutils
pero tenga en cuenta que " el instalador de pip recomendado ejecuta todos los scripts setup.pysetuptools
, incluso si el script solo importadistutils
" ( fuente )Respuestas:
Echa un vistazo a esta pregunta SO. Explica todos los métodos de empaque muy bien y podría ayudar a responder su pregunta hasta cierto punto: ¿ Diferencias entre distribuir, distutils, setuptools y distutils2?
Entonces, como puede ver, las herramientas de configuración deberían preferirse a distutils, y veo de dónde proviene su pregunta, sin embargo, no veo que distutils pierda soporte en el corto plazo, ya que, simplemente, se usa en muchos casos con algunos programas heredados populares . Y, como probablemente sepa, cambiar este tipo de cosas en los programas heredados puede ser bastante difícil y puede tener bastantes problemas, por ejemplo, incompatibilidades, lo que llevaría al desarrollador a tener que volver a escribir el código fuente. Así que está eso, y también el hecho de que distutils es parte de la biblioteca estándar de Python, mientras que setuptools no lo es. Por lo tanto, si está creando un programa de Python, hoy en día, use setuptools, sin embargo, tenga en cuenta que sin distutils, setuptools nunca hubiera existido.
fuente
Esa es una de las razones. Lo siguiente es directo de NumPy
setup.py
:Entonces NumPy prefiere
setuptools
si puede encontrarlo. Pero entonces SciPy solía hacer esto, hasta que fue parchado para preferirdistutils
en algunas situaciones. Citando el registro de confirmación:Por supuesto, una fusión entre
setuptools
ydistribute
debería resolver todo esto a su debido tiempo, pero muchos paquetes aún necesitan soportar las instalaciones de Python 2.6.fuente
distribute
era una bifurcación desetuptools
y ahora está fusionadaHay varias razones por las que todavía hablamos y usamos distutils, aunque setuptools es sin duda el mejor conjunto de herramientas.
En primer lugar, distutils está disponible en todas partes. Si está buscando construir un módulo para compartir con otros, y no tiene requisitos complicados, está garantizado que estará disponible en su máquina de trabajo. Esto es particularmente importante si tiene que soportar versiones anteriores de python, o si se encuentra trabajando en un entorno desconocido.
En segundo lugar, setuptools proporciona mejoras a distutils. Por lo tanto, está modelado a partir del conjunto de herramientas distutils y toma toda su estructura desde allí. La documentación de setuptools asume que el lector está familiarizado con distutils y solo documenta cómo mejora el conjunto de herramientas base. Puede pensar que distutils define el dialecto y que setuptools mejora ese dialecto.
Mi enfoque personal para nuevos proyectos es comenzar con la suposición de que voy a usar distutils. Solo cuando el proyecto crece para requerir una función de herramientas de configuración hago la actualización. Setuptools es un reemplazo directo para distutils, es un cambio de una línea a mi setup.py.
fuente
Básicamente, se debe a la división de responsabilidades.
setuptools
no es parte de la biblioteca estándar de Python porque es mantenida por un tercero en lugar del equipo central de Python. Lo que significa, entre otras cosas:Efectivamente, el equipo central ha reducido el alcance de distutils , reservando los "estándares básicos" y las partes de "compilación mínima necesaria" para sí mismos mientras deja todo lo demás más allá de eso (compilador extendido / formato de paquete / cualquier soporte) a terceros. El código que anteriormente cubría esas "partes extendidas" quedó obsoleto por compatibilidad con versiones anteriores.
Desde la distribución de módulos de Python : documentación de Python 2.7.12 :
También es probable que los paquetes para otros sistemas operativos proporcionen
setuptools
y porpip
separado, por los motivos antes mencionadosfuente