Diferencias entre distribute, distutils, setuptools y distutils2?


La situación

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

Por lo tanto, necesito ejecutar 2to3 automáticamente al compilar para Python 3. Para hacer eso, necesito usar distribute. Por lo tanto, necesito portar el sistema actual, que (según el doctest) es distutils.


El problema

Desafortunadamente, no estoy seguro de cuál es la diferencia entre estos módulos-distutils, distribute, setuptools. El la documentación es lo mejor, ya que todos parecen ser una bifurcación entre sí, con la intención de ser compatibles en la mayoría de las circunstancias (pero en realidad, no en todas) and 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? (Como un aparte, también apreciaría alguna guía sobre la adaptación a Distribute, pero eso está un poco más allá del alcance de la pregunta {)

Author: Flimm, 2011-06-14

7 answers

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

La Guía del Usuario de Python Packaging vale la pena leerla. Cada página tiene una fecha de "última revisión" mostrada, por lo que puede verificar la actualidad del manual, y es bastante completo. El hecho de que está alojado en un subdominio de python.org de la Python Software Foundation solo le agrega credibilidad. La página Resúmenes de proyectos es especialmente relevante aquí.

Resumen de herramientas:

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

Herramientas soportadas:

  • Distutils sigue siendo la herramienta estándar para empaquetar en Python. Está incluido en la biblioteca estándar (Python 2 y Python 3.0 a 3.6). Es útil para Python simple distribuciones, pero carece de características. Introduce el paquete Python distutils que se puede importar en su script 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 Python setuptools que se puede importar en su script setup.py, y el paquete Python pkg_resources que se puede importar en su código para localizar los archivos de datos instalados con una distribución. Una de sus trampas es que monkey-patches el paquete Python distutils. Debería funcionar bien con pip. ve lanzamientos regulares.

  • Scikit-build es un generador de sistema de compilación mejorado que utiliza internamente CMake para construir extensiones compiladas de Python. Debido a que scikit-build no está basado en distutils, realmente no tiene ninguna de sus limitaciones. Cuando ninja-build está presente, scikit-build puede compilar proyectos grandes 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 un tenedor de Setuptools. Compartía el mismo espacio de nombres, por lo que si tuviera Distribuy instalado, import setuptools importaría el paquete distribuido con Distribute. Distribuir se fusionó de nuevo en Setuptools 0.7, así que ya no necesitas usar Distribute. 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 Distribuir y convertirse en la herramienta estándar incluida en la biblioteca estándar de Python. La idea era que Distutils2 se distribuyera para versiones antiguas de Python, y que Distutils2 se renombrara a packaging para Python 3.3, que lo incluiría en su biblioteca estándar. Sin embargo, estos planes no salieron según lo previsto, 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.

Alpha software:

  • Distlib es una herramienta que tiene como objetivo implementar un subconjunto de la funcionalidad de las herramientas anteriores, pero solo la funcionalidad que está muy bien definida en los PEPS aceptados. Es una de las herramientas de la PyPA (Python Package Authority), y espero que sea incluido eventualmente en la biblioteca estándar de Python algún día. Todavía se considera software alfa, por lo que los usuarios finales tengan cuidado.

  • Hay un par de herramientas más (por ejemplo: Bento), pero no las mencionaré ya que son demasiado oscuras o de nicho o tempranas o no desarrolladas para esto responder post, o de lo contrario no son alternativas directas.

Recomendación:

Así que en conclusión, de todas estas opciones, 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 le ayuda a instalar pip en algunos sistemas).

Si usted está buscando en Virtualenv, usted 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 Setuptools/Distribute, tanto para Python 2 como para 3.

 790
Author: Flimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 01:13:30

Soy mantenedor de distutils y contribuidor de distutils2/packaging. Hice una charla sobre el empaquetado de Python en ConFoo 2011 y en estos días estoy escribiendo una versión extendida del mismo. 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 envasado. Funciona bastante bien para necesidades simples, pero es limitado y no trivial de extender.

  • Setuptools es un proyecto nacido del deseo para completar la funcionalidad de distutils que falta y explorar nuevas direcciones. En algunas subcomunidades, es un estándar de facto. Utiliza monkey-patching y magia que es mal visto por los desarrolladores del núcleo de Python.

  • Distribute es un fork de Setuptools que fue iniciado por desarrolladores que sintieron que su ritmo de desarrollo era demasiado lento y que no era posible desarrollarlo. Su desarrollo se ralentizó considerablemente cuando el mismo grupo inició distutils2. 2013-Actualización de agosto: distribute se fusiona de nuevo en setuptools y se descontinúa.

  • Distutils2 es una nueva biblioteca de distutils, iniciada como una bifurcación de la base de código de distutils, con buenas ideas tomadas de herramientas de configuración (de las cuales algunas se discutieron a fondo en PEPs), y un instalador básico inspirado en pip. El nombre real que usa para importar Distutils2 es packaging en la biblioteca estándar Python 3.3+, o distutils2 en 2.4+ y 3.1–3.2. (Un backport estará disponible pronto.) Distutils2 no hizo el lanzamiento de Python 3.3, y fue puesto en espera.

Más información:

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

 251
Author: Éric Araujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 23:17:16

NOTA: Respuesta obsoleta, Distribución ahora obsoleta.

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 embalaje original). Setuptools no se estaba manteniendo por lo que fue bifurcado y renombrado, sin embargo, cuando se instala utiliza el nombre del paquete de setuptools! Creo que la mayoría de los desarrolladores de Python ahora usan Distribute, y puedo decir con seguridad que lo hago.
 7
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-17 17:32:34

Actualizando esta pregunta a finales de 2014, donde afortunadamente el caos de empaquetado de Python ha sido limpiado en gran medida por el gestor de paquetes " conda" de Continuum.

En particular, conda habilita rápidamente 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 entornos Python ("py34" o "py26") 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 el caso de que tenga que lidiar con una versión diferente de Python.

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

  • Agnóstico de Python
  • Multiplataforma
  • No se requieren privilegios de administrador
  • Gestión inteligente de dependencias (a través de un solucionador SAT)
  • Trata muy bien con C, Fortran y bibliotecas de nivel de sistema que puede tener que enlazar con

Este último punto es especialmente importante si usted está en el campo de la computación científica.

 4
Author: Julien Chastang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-29 21:26:30

Muchas personas se quejaron aquí de la falta de una orientación clara de la comunidad sobre este tema.

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

 4
Author: Lucas Cimon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-03 09:39:10

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

Estoy tratando de portar una biblioteca de código abierto (SymPy, si alguien se lo pregunta) a Python 3. A haga esto, necesito ejecutar 2to3 automáticamente cuando compile para Python 3.

Que puede, no necesitan. Otras estrategias se describen en http://docs.python.org/dev/howto/pyporting

Para hacer eso, necesito para utilizar distribuir,

You may :) distutils soporta la conversión 2to3 en tiempo de compilación para código (no docstrings), de una manera diferente a la de distribut's: http://docs.python.org/dev/howto/pyporting#during-installation

 3
Author: Éric Araujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-29 14:16:08

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

 2
Author: Love and peace - Joe Codeswell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-01 18:49:42