¿Diferencias entre distribuir, distutils, setuptools y distutils2?

594

La situación

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

Entonces, necesito ejecutar 2to3automáticamente cuando compilo 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

Por desgracia, no estoy seguro de cuál es la diferencia entre estos Modules- distutils, distribute, setuptools. La documentación es incompleta como la mejor, ya que todos parecen ser una bifurcación entre sí, destinados a ser compatibles en la mayoría de las circunstancias (pero en realidad, no todas) ... 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 la portabilidad Distribute, pero eso está un poco más allá del alcance de la pregunta ...)

VPeric
fuente
22
Que confuso He venido a Python desde un fondo Java / C ++. En esas situaciones, la distribución es muy sencilla. Con python, estoy completamente confundido con respecto a todos estos sistemas de distribución.
Raffi Khatchadourian
75
Estoy de acuerdo, el empaquetado / instalación de Python tiene demasiadas alternativas sin una guía clara de la comunidad.
Sabuncu
66
Solo quería vincular esta información relacionada en pip que no admite distribuciones binarias lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat
@pixelbeat pip admite la instalación de ruedas (llamadas distribuciones binarias), ese enlace está desactualizado.
Flimm

Respuestas:

836

A partir de marzo de 2020, la mayoría de las otras respuestas a esta pregunta están desactualizadas varios años. Cuando encuentre consejos sobre problemas de empaquetado de Python, recuerde consultar la fecha de publicación y no confíe en la información desactualizada.

El Python Guía del usuario Embalaje es digno de una lectura. Cada página muestra una fecha de "última actualización", 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 da crédito. La página de Resúmenes de proyectos es especialmente relevante aquí.

Resumen de herramientas:

Aquí hay un resumen del panorama del empaque de Python:

Herramientas compatibles:

Herramientas obsoletas / abandonadas:

  • distributefue un tenedor de setuptools. Compartía el mismo espacio de nombres, por lo que si tuviera instalado Distribute, en import setuptoolsrealidad importaría el paquete distribuido con Distribute. Distribuir se fusionó nuevamente 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.

  • distutils2fue un intento de tomar lo mejor de distutils, setuptoolsy distributey convertirse en la herramienta estándar incluida en la biblioteca estándar de Python. La idea era que distutils2se distribuiría para las versiones antiguas de Python, y que distutils2se renombraría packagingpara Python 3.3, que lo incluiría en su biblioteca estándar. Sin embargo, estos planes no salieron según lo previsto, y actualmente distutils2es un proyecto abandonado . El último lanzamiento fue en marzo de 2012, y su página de inicio de Pypi finalmente se actualizó para reflejar su muerte.

Otros:

Existen otras herramientas, si está interesado, lea Resúmenes de proyectos en la Guía del usuario de Python Packaging. No voy a enumerarlas todas, para no repetir esa página, y para mantener la respuesta a la pregunta a juego, que era sólo alrededor de distribute, distutils, setuptoolsy distutils2.

Recomendación:

Si todo esto es nuevo para usted, y no sabe por dónde comenzar, recomendaría aprendersetuptools , junto con pipy virtualenv, que funcionan muy bien juntos.

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

Flimm
fuente
2
@makeramen: vea este hilo en la lista de correo .
Flimm
66
Y no se ve mejor: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI Distribuir página.
KurzedMetal
3
@KurzedMetal, de acuerdo con la gente de SetupTools, setuptools 0.7 subsumirá tanto el orden de restauración del universo como la distribución de las herramientas de configuración antiguas. ¡Así que las cosas mejorarán considerablemente!
John McDonnell
8
La Guía del usuario de Python Packaging tendrá la información más actualizada sobre el estado de Python Packaging. Fue notado por Nick Coughlan en la PyCon 2013 .
imanuelcostigan
1
@Flimm La última edición es hace bastante tiempo. ¿Bento ya está maduro?
Martin Thoma
251

Soy mantenedor de distutils y colaborador 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. Todavía no está 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 de extender.

  • Setuptools es un proyecto nacido del deseo de llenar la funcionalidad distutils que falta y explorar nuevas direcciones. En algunas subcomunidades, es un estándar de facto . Utiliza parches de mono y magia mal vista por los desarrolladores centrales de Python.

  • Distribuir es una bifurcación de Setuptools que los desarrolladores iniciaron 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 2013-agosto: la distribución se fusiona nuevamente en las herramientas de configuración y se suspende.

  • Distutils2 es una nueva biblioteca de distutils, que comenzó como una bifurcación de la base de código de distutils, con buenas ideas tomadas de las herramientas de configuración (algunas de las cuales se discutieron a fondo en PEP) y un instalador básico inspirado en pip. El nombre real que usa para importar Distutils2 está packagingen la biblioteca estándar Python 3.3+, o distutils2en 2.4+ y 3.1–3.2. (Un backport estará disponible pronto). Distutils2 no realizó la versión Python 3.3, y se puso 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.

Éric Araujo
fuente
1
No. distutils2 toma algunas buenas ideas de setuptools / distribution, después de la estandarización (PEP) o no (por ejemplo, soy mentor de un estudiante de GSoC que agrega un comando de desarrollo y generación automática de scripts), pero nunca será un complemento reemplazo: hay algunas partes que no queremos (huevos, integración VCS, etc.). OTOH, distutils2 tiene algunas cosas que setuptools / distribution no tiene. Para facilitar la transición, creo que los desarrolladores de distribución pueden usar distutils2 para admitir nuevos estándares y herramientas; También creo recordar que el desarrollador de setuptools dijo que quiere admitir nuevos estándares.
Éric Araujo
1
¿Dónde cae ez_setup en todo esto? ¿También hay actualizaciones para el estado de distutils2?
James McMahon
2
@ ÉricAraujo Lamento escuchar sobre el retraso. ¡Realmente espero que esté listo a tiempo para 3.4! Me encanta Python, pero el empaque siempre me ha hecho golpear mi cabeza contra la pared. (En otras noticias, ¿cómo va su guía? Si está terminada, ¿podría vincularla en su respuesta anterior?)
Zearin
99
@AlexisHuet Este tipo de comentario sería mejor si contuviera el enlace al comentario a continuación (que puede obtener desde el sharebotón).
erikbwork
2
quizás debería actualizar la respuesta para mencionar que distributerecientemente se fusionó nuevamente setuptools. El hecho de que gran parte de la información está desactualizada aumenta la confusión
Amro
5

NOTA: Respuesta en desuso, Distribuir ahora obsoleto. Esta respuesta ya no es válida ya que se formó la Autoridad de Empaque de Python y ha trabajado mucho para limpiar esto.


Sí, lo tienes. : -o Creo que en este momento el paquete preferido es Distribuir , que es una bifurcación de herramientas de configuración, que son una extensión de distutils (el sistema de empaquetado original). Setuptools no se mantenía, por lo que se bifurcó y cambió de nombre, 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 certeza que sí.

Keith
fuente
Para el registro, acepté esta respuesta porque ahora me decía la situación (y la bifurcación es una extensión de relación que la imagen en la otra respuesta simplemente no menciona). Y en algún lugar del camino también aprendí que la documentación en sí misma no suele estar segura de lo que está tratando de decir.
VPeric
2
@VPeric, de hecho, la documentación refleja el hecho de que este aspecto de Python está en un estado de flujo / desastre.
juanchopanza
2

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. Para hacer esto, necesito ejecutar 2to3 automáticamente cuando compilo para Python 3.

Puede que no lo necesite . Otras estrategias se describen en http://docs.python.org/dev/howto/pyporting

Para hacer eso, necesito usar distribuir,

Usted puede :) distutils conversión 2to3 soportes-tiempo de construcción de código (no docstrings), de una manera diferente que distribuyen de: http://docs.python.org/dev/howto/pyporting#during-installation

Éric Araujo
fuente
Gracias, aunque ya hemos decidido resolver el problema escribiendo nuestro script para manejar la conversión. Y sí, sabía que había otras opciones además de usar 2to3, pero SymPy es una base de código compleja (alrededor de 200k + líneas la última vez que verifiqué) y usar 2to3 era la única estrategia realista. Gracias de nuevo, en cualquier caso!
VPeric
2

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

En particular, conda permite rápidamente la creación de " entornos " conda . 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.

Luego 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 diferentes versiones de Python.

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

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

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

Julien Chastang
fuente