Pregunta ¿Diferencias entre distribuir, distutils, setuptools y distutils2?


La situación

Estoy tratando de portar una biblioteca de código abierto a Python 3. (SymPy, si alguien se pregunta.)

Entonces, necesito correr 2to3 automáticamente al construir para Python 3. Para hacer eso, necesito usar distribute. Por lo tanto, necesito conectar el sistema actual, que (de acuerdo con el doctest) es distutils.


El problema

Lamentablemente, no estoy seguro de cuál es la diferencia entre estos módulos-distutils, distribute, setuptools. La documentación es incompleta como mejor, ya que todos parecen ser un tenedor el uno del otro, destinados a ser compatibles en la mayoría de las circunstancias (pero en realidad, no todos) ... y así sucesivamente, y así sucesivamente.


La pregunta

¿Alguien podría explicar las diferencias? ¿Qué se supone que debo usar? ¿Cuál es la solución más moderna? (Por otro lado, también agradecería alguna guía sobre portar a Distribute, pero eso es un poco más allá del alcance de la pregunta ...)


552
2018-06-14 13:17


origen


Respuestas:


A partir de enero de 2017, todas las demás respuestas a esta pregunta tienen al menos dos años de antigüedad. Cuando encuentre consejos sobre problemas de empaquetado de Python, recuerde mirar la fecha de publicación y no confíe en información obsoleta.

los Guía de usuario de empaquetado de Python vale la pena leerlo Cada página tiene una fecha de "última revisión" mostrada, por lo que puede verificar la actualidad del manual, y es bastante completa. El hecho de que esté alojado en un subdominio de python.org de Python Software Foundation simplemente le da más crédito. los Resúmenes de proyectos la página es especialmente relevante aquí.

Resumen de herramientas:

Aquí hay un resumen del panorama de empaquetado de Python en enero de 2017:

Herramientas compatibles:

  • 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.6). Es útil para distribuciones simples de Python, pero carece de características. Introduce el distutils Paquete de Python que se puede importar en su setup.py guión.

  • Herramientas de configuración 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 setuptools Paquete de Python que se puede importar en su setup.py script, y el pkg_resources Paquete de Python que se puede importar en su código para localizar archivos de datos instalados con una distribución. Una de sus trampas es que parchea el mono distutils Paquete de Python Debería funcionar bien con pip. Ve lanzamientos regulares.

  • scikit-build es un generador de sistema de compilación mejorado que internamente utiliza CMake para compilar extensiones compiladas de Python. Debido a que scikit-build no se basa en distutils, realmente no tiene ninguna de sus limitaciones. Cuando ninja-build está presente, scikit-build puede compilar grandes proyectos más de tres veces más rápido que las alternativas. Debería funcionar bien con pip. Ve lanzamientos regulares.

Herramientas obsoletas / abandonadas:

  • Distribuir era una bifurcación de Setuptools. Compartía el mismo espacio de nombres, por lo que si tenía Distribute instalado, import setuptools en realidad importaría el paquete distribuido con Distribute. Distribuir se fusionó de nuevo en Setuptools 0.7, por lo que ya no necesita usar Distribuir. De hecho, la versión en Pypi es solo una capa de compatibilidad que instala Setuptools.

  • Distutils2 fue un intento de tomar lo mejor de Distutils, Setuptools y Distribute y convertirse en la herramienta estándar incluida en la biblioteca estándar de Python. La idea era que Distutils2 se distribuiría para versiones antiguas de Python, y que Distutils2 se cambiaría a packaging para Python 3.3, que lo incluiría en su biblioteca estándar. Estos planes no fueron como se esperaba, sin embargo, y actualmente, Distutils2 es un proyecto abandonado. El último lanzamiento fue en marzo de 2012, y su página de inicio Pypi finalmente se ha actualizado para reflejar su muerte.

Software Alpha:

  • Distlib es una herramienta que tiene como objetivo implementar un subconjunto de la funcionalidad de las herramientas anteriores, pero solo una funcionalidad que está muy bien definida en las PEP aceptadas. Es una de las herramientas de PyPA (Autoridad de paquetes de Python) y, con suerte, algún día se incluirá en la biblioteca estándar de Python. Todavía se considera software alfa, por lo que los usuarios finales deben tener cuidado.

  • Existen un par de herramientas más (por ej., Bento), pero no los mencionaré porque son demasiado oscuros o nichos o están adelantados o no desarrollados para esta publicación de respuesta, o bien no son alternativas directas.

Recomendación:

Entonces, en conclusión, de todas estas opciones, Yo recomendaría Setuptools, a menos que sus requisitos sean muy básicos y solo necesite Distutils. Setuptools funciona muy bien con Virtualenv y Pip, herramientas que recomiendo encarecidamente. Virtualenv y Pip podrían considerarse oficiales, ya que son parte de PyPA, y Python 3 ahora se envía ensurepip (que te ayuda a instalar pip en algunos sistemas).

Si está buscando en Virtualenv, podría estar interesado en esta pregunta: Cuál es la diferencia entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc.?. (Sí, lo sé, gimo contigo).

Como nota al margen, recomiendo usar Virtualenv 1.10 o superior, ya que es la primera versión que reconoce la fusión Configurar / Distribuir, tanto para Python 2 como para 3.


783
2018-02-07 14:37



Soy un mantenedor de distutils y colaborador de empaquetado de distutils2. Hice una charla sobre el empaquetado de Python en ConFoo 2011 y en estos días estoy escribiendo una versión extendida. Aún no se ha publicado, así que aquí hay extractos que deberían ayudar a definir las cosas.

  • Distutils es la herramienta estándar utilizada para el embalaje. Funciona bastante bien para necesidades simples, pero es limitado y no es trivial extenderlo.

  • Herramientas de configuración es un proyecto nacido del deseo de completar la funcionalidad de distutils que faltan y explorar nuevas direcciones. En algunas subcomunidades, es un de factoestándar. Utiliza parches de monos y magia que los desarrolladores principales de Python no ven con buenos ojos.

  • Distribuir es un fork de Setuptools que fue iniciado por los desarrolladores sintiendo que su ritmo de desarrollo era demasiado lento y que no era posible evolucionarlo. Su desarrollo se ralentizó considerablemente cuando distutils2 fue iniciado por el mismo grupo. Actualización de 2013 a agosto: la distribución se fusionó nuevamente en setuptools y se suspendió.

  • Distutils2 es una nueva biblioteca de distutils, iniciada como una bifurcación del código base de distutils, con buenas ideas extraídas de las herramientas de configuración (algunas de las cuales se analizaron a fondo en PEP) y un instalador básico inspirado en pip. El nombre real que usa para importar Distutils2 es packaging en la biblioteca estándar de Python 3.3+, o distutils2 en 2.4+ y 3.1-3.2. (Un backport estará disponible pronto). Distutils2 no hizo la versión de Python 3.3, y se puso en espera.

Más información:

Espero terminar pronto mi guía, que contendrá más información sobre los puntos fuertes y débiles de cada biblioteca y una guía de transición.


251
2018-06-29 15:07



NOTA: Respuesta obsoleta, Distribuir ahora obsoleto.

Sí, lo tienes. : -o creo que en este momento el paquete preferido es Distribuir, que es una bifurcación de setuptools, que son una extensión de distutils (el sistema de empaquetado original). Setuptools no se mantenía así que se bifurca y renombra, sin embargo, cuando está instalado, usa el nombre del paquete de setuptools. Creo que la mayoría de los desarrolladores de Python ahora usan Distribute, y puedo asegurar que lo hago.


7
2018-06-14 14:00



Actualizando esta pregunta a finales de 2014 donde, afortunadamente, el caos de empaque de Python ha sido limpiado en gran medida por Continuum ".conda" gerente de empaquetación.

En particular, conda rápidamente permite la creación de conda "ambientes". Puede configurar sus entornos con diferentes versiones de Python. Por ejemplo:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

creará dos ("py34" o "py26") entornos de Python con diferentes versiones de Python.

Después, puede invocar el entorno con la versión específica de Python con:

source activate <env name>

Esta característica parece especialmente útil en su caso en el que tiene que lidiar con una versión diferente de Python.

Además, conda tiene las siguientes características:

  • Python agnóstico
  • Plataforma cruzada
  • No se requieren privilegios de administrador
  • Gestión de dependencia inteligente (por medio de un solucionador de SAT)
  • Muy bien trata con C, Fortran y las bibliotecas de nivel del sistema que puede tener que vincular contra

Ese último punto es especialmente importante si estás en el campo de la informática científica.


4
2017-09-29 21:26



Mucha gente se quejó aquí de la falta de una guía comunitaria clara sobre este tema.

Actualmente, esta parece ser la mejor fuente autorizada de recomendaciones de herramientas: https://packaging.python.org/en/latest/current.html#tool-recommendations


4
2017-10-03 09:39



Me doy cuenta de que he respondido a su pregunta secundaria sin abordar supuestos incuestionables en su problema original:

Estoy tratando de portar una biblioteca de código abierto (SymPy, si alguien se está preguntando) a Python 3. Para   haz esto, necesito ejecutar 2to3 automáticamente cuando construyas para Python 3.

mayono necesitar. Otras estrategias se describen en http://docs.python.org/dev/howto/pyporting

Para hacer eso, necesito usar distribuir,

mayo :) distutils admite la conversión de tiempo de compilación 2to3 para el código (no docstrings), de una manera diferente que distribuye: http://docs.python.org/dev/howto/pyporting#during-installation


3
2017-07-29 14:16



Este tema parece estar en constante cambio. A partir del 10-31-2013, la "Guía del usuario de Python Packaging" Recomendaciones rápidas define "qué conjunto de herramientas se recomienda actualmente". También enlaces a "El futuro del empaque de Python"


2
2017-11-01 18:43