example - python setuptools setup
setuptools vs. distutils: ¿por qué distutils sigue siendo una cosa? (4)
es el hecho de que setuptools no está en la biblioteca estándar, la única razón
Esa es una razón. Lo siguiente es directo desde NumPy setup.py
:
if len(sys.argv) >= 2 and (''--help'' in sys.argv[1:] or
sys.argv[1] in (''--help-commands'', ''egg_info'', ''--version'',
''clean'')):
# Use setuptools for these commands (they don''t work well or at all
# with distutils). For normal builds use distutils.
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
Entonces NumPy prefiere setuptools
si puede encontrarlo. Pero luego SciPy solía hacer esto, hasta que fue patched para preferir distutils
en algunas situaciones. Citando el registro de commit:
Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.
Por supuesto, una fusión entre setuptools
y distribute
debería resolver todo esto a su debido tiempo, pero muchos paquetes aún necesitan admitir instalaciones de Python 2.6.
Python tiene un historial confuso de herramientas que se pueden usar para empaquetar y describir proyectos: estos incluyen distutils
en la biblioteca estándar, distribute
, distutils2
y setuptools
(y tal vez más). Parece que distribute
y distutils2
se suspendieron a favor de setuptools
, lo que deja dos estándares en competencia.
A mi entender, las setuptools
ofrecen muchas más opciones (por ejemplo, declarar dependencias, pruebas, etc.) que distutils
, sin embargo, no están incluidas en la biblioteca estándar de Python (¿todavía?).
La Guía del usuario de Python Packaging [ 1 ] recomienda ahora:
Use
setuptools
para definir proyectos y crear distribuciones de origen.
Y explica:
Aunque puede usar
distutils
puros para muchos proyectos, no es compatible con la definición de dependencias en otros proyectos y le faltan varias utilidades de conveniencia para completar automáticamente los metadatos del paquete proporcionados por lassetuptools
desetuptools
. Al estar fuera de la biblioteca estándar, setuptools también ofrece funciones más consistentes en las diferentes versiones de Python, y (a diferencia dedistutils
), lassetuptools
se actualizarán para producir los próximos formatos estándar de "Metadata 2.0" en todas las versiones compatibles.Incluso para los proyectos que eligen utilizar
distutils
, cuando pip instala dichos proyectos directamente desde el origen (en lugar de instalarlos desde un archivo de rueda preconstruido), en realidad construirá su proyecto utilizando lassetuptools
.
Sin embargo, al buscar en los archivos setup.py de varios proyectos, se revela que esto no parece ser un estándar real. Muchos paquetes aún usan distutils
y aquellos que soportan setuptools
menudo mezclan setuptools
con distutils
por ejemplo haciendo una importación de distutils
:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
Seguido por un intento de encontrar una manera de escribir una configuración que pueda instalar tanto setuptools
como distutils
. Esto a menudo incluye varias formas de comprobación de dependencias propensas a errores, ya que distutils
no admite dependencias en la función de configuración.
¿Por qué las personas siguen haciendo un esfuerzo extra para soportar distutils
? ¿Es el hecho de que setuptools
no está en la biblioteca estándar la única razón? ¿Cuáles son las ventajas de distutils
y existen inconvenientes al escribir archivos setup.py que solo admiten setuptools
?
Echa un vistazo a esto. Explica todos los métodos de empaquetado muy bien, y podría ayudar a responder su pregunta hasta cierto punto: webpage
Distutils sigue siendo la herramienta estándar para empaquetar en Python. Se incluye en la biblioteca estándar (Python 2 y Python 3.0 a 3.3). Es útil para distribuciones simples de Python, pero carece de características. Introduce el paquete distutils Python que se puede importar en su secuencia de comandos setup.py.
Setuptools fue desarrollado para superar las limitaciones de Distutils, y no está incluido en la biblioteca estándar. Introdujo una utilidad de línea de comandos llamada easy_install. También introdujo el paquete setuptools Python que se puede importar en su secuencia de comandos setup.py y el paquete pkg_resources Python que se puede importar en su código para ubicar los archivos de datos instalados con una distribución. Una de sus trampas es que parchea el paquete Distutils Python. Debería funcionar bien con pip. La última versión fue lanzada en julio de 2013.
Entonces, como puede ver, las herramientas de configuración deben ser preferidas a distutils, y veo de dónde viene su pregunta, sin embargo, no veo que distutils pierda soporte pronto, ya que, en pocas palabras, en muchos casos (especialmente los programas heredados) el estándar de facto. Y como probablemente sepa, cambiar este tipo de cosas en los programas heredados puede ser bastante doloroso e incluir bastantes problemas, por ejemplo, incompatibilidades, que luego llevarían al desarrollador a reescribir el código fuente. Así que está eso, y también el hecho de que distutils es una parte de la biblioteca de python estándar, mientras que setuptools no lo es. Por lo tanto, si está creando un programa python, en este día y edad, use herramientas de configuración, sin embargo, tenga en cuenta que sin distutils, las herramientas de configuración nunca habrían existido.
Hay varias razones por las que aún 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 admitir versiones anteriores de python, o si se encuentra trabajando en un entorno desconocido.
En segundo lugar, setuptools proporciona mejoras a distutils. Por lo tanto, se basa en el conjunto de herramientas de distutils y toma toda su estructura desde allí. La documentación para setuptools asume que el lector está familiarizado con distutils y solo documenta cómo mejora el conjunto de herramientas base. Puedes pensar que distutils define el dialecto y las herramientas de configuración mejoran ese dialecto.
Mi enfoque personal para nuevos proyectos comienza con la suposición de que voy a usar distutils. Solo a medida que crece el proyecto para requerir una característica de setuptools hago la actualización. El setuptools es un reemplazo directo para distutils, es un cambio de una línea en mi setup.py.
Básicamente, se debe a la división de responsabilidades.
setuptools
no forma parte de la biblioteca estándar de Python porque es mantenida por un tercero y no por el equipo central de Python. Lo que significa, entre otras cosas:
- no está cubierto por el conjunto de pruebas centrales y la funcionalidad central no la utiliza
- en sí mismo no establece estándares básicos para los módulos complementarios (su ubicación, medios de importación, interfaz binaria de extensiones C, etc.).
- se actualiza y se lanza independientemente de las versiones de Python
Efectivamente, el equipo central ha reducido el alcance de distutils , reservando las partes de "normas básicas" y "compilación mínima necesaria" para ellos mismos , dejando todas las cosas más allá de eso (formato extendido de compilador / paquete / soporte) a terceros. El código que anteriormente cubría esas "partes extendidas" quedó obsoleto para compatibilidad con versiones anteriores.
Desde la distribución de módulos de Python : documentación de Python 2.7.12 :
Aunque el uso directo de
distutils
se está eliminando gradualmente, todavía sentó las bases para la infraestructura actual de empaquetado y distribución, y no solo permanece como parte de la biblioteca estándar, sino que su nombre perdura de otras maneras (como el nombre del correo). lista utilizada para coordinar el desarrollo de estándares de empaque de Python).
También es probable que los paquetes para otros sistemas operativos proporcionen setuptools
y pip
separado, por los motivos antes mencionados.
- y porque no son necesarios, o incluso son perjudiciales para la mantenibilidad, cuando ya hay otro administrador de paquetes en el sistema.