index find_packages create python packaging setuptools distutils distribute

python - create - setuptools find_packages



¿Diferencias entre distribuir, distutils, setuptools y distutils2? (7)

A partir de enero de 2017, todas las demás respuestas a esta pregunta tienen una antigüedad de al menos dos 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.

La Guía del usuario de Python Packaging merece una lectura. Cada página tiene una fecha de "última revisió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 Python Software Foundation simplemente le da credibilidad. La página de resúmenes de proyectos es especialmente relevante aquí.

Resumen de herramientas:

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

Herramientas soportadas:

  • 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 Python simples, pero carece de características. Introduce el paquete de 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 setuptools Python que se puede importar en su script setup.py , y el paquete pkg_resources Python que se puede importar en su código para localizar archivos de datos instalados con una distribución. Uno de sus problemas es que parchea los parches del paquete Python. 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 compilar extensiones compiladas de Python. Debido a que scikit-build no está basado en nombres, en realidad no tiene ninguna de sus limitaciones. Cuando ninja-build está presente, scikit-build puede compilar proyectos grandes tres veces más rápido que las alternativas. Debería funcionar bien con pip . Ve lanzamientos regulares.

Herramientas en desuso / abandonadas:

  • Distribuir era un tenedor de Setuptools. Compartía el mismo espacio de nombres, por lo que si tenía Distribute instalado, import setuptools importaría el paquete distribuido con Distribute. Distribute se fusionó de nuevo con Setuptools 0.7 , por lo que ya no necesita 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 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 sería renombrado a packaging para Python 3.3, que lo incluiría en su biblioteca estándar. Sin embargo, estos planes no fueron como se esperaba y, actualmente, Distutils2 es un proyecto abandonado . El último lanzamiento fue en marzo de 2012, y su página de inicio de Pypi finalmente se ha actualizado para reflejar su muerte.

Software alfa

  • 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 los PEP aceptados. Es una de las herramientas de PyPA (Python Package Authority), y esperamos que se incluya en algún momento en la biblioteca estándar de Python. Todavía se considera software alfa, así que ten cuidado con los usuarios finales.

  • Hay un par de herramientas más (p. Ej., Bento), pero no las mencionaré porque son demasiado oscuras o de nicho o no están desarrolladas para esta respuesta, o no son alternativas directas.

Recomendación:

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 altamente. Tanto Virtualenv como Pip pueden considerarse oficiales, ya que son parte de PyPA, y Python 3 ahora se envía ensurepip (lo que 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 Setuptools / Distribute, tanto para Python 2 como para 3.

La situación

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

Por lo tanto, necesito ejecutar 2to3 automáticamente al 2to3 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 distutils : distribute , distribute , setuptools . La documentación es lo más esquemática posible, ya que todas parecen ser una bifurcación la una de la otra, destinadas a ser compatibles en la mayoría de las circunstancias (pero en realidad, no todas) ... y así sucesivamente, etc.


La pregunta

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


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

En particular, Conda permite rápidamente la creación de " environments " de Conda. Puedes configurar tus 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 diferentes versiones de Python.

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

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

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



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

Estoy tratando de trasladar una biblioteca de código abierto (SymPy, si alguien se lo está preguntando) a Python 3. Para hacer esto, necesito ejecutar 2to3 automáticamente al compilar para Python 3.

Usted puede , no es necesario . Otras estrategias se describen en http://docs.python.org/dev/howto/pyporting

Para hacer eso, necesito usar Distribuir,

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



NOTA: Conteste en desuso, Distribuya ahora obsoleto.

Sí, lo tienes. : -o creo que en este momento el paquete preferido es Distribute , que es una bifurcación de setuptools, que es una extensión de distutils (el sistema de embalaje original). Setuptools no se mantenía, por lo que se bifurcó y cambió de nombre, sin embargo, cuando se instala usa 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 sí.


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

  • Setuptools es un proyecto que nace del deseo de llenar la funcionalidad de los distritos faltantes y explorar nuevas direcciones. En algunas subcomunidades, es un estándar de facto . Utiliza parches de mono y magia que es mal visto por los desarrolladores de Python Core.

  • Distribute es una bifurcación de Setuptools que fue iniciada por los desarrolladores sintiendo que su ritmo de desarrollo era demasiado lento y que no era posible evolucionarlo. Su desarrollo se desaceleró considerablemente cuando distutils2 fue iniciado por el mismo grupo. Actualización de agosto de 2013: la distribución se fusiona de nuevo en setuptools y se suspende.

  • Distutils2 es una nueva biblioteca de distutils, iniciada como una bifurcación del código base de distutils, con buenas ideas tomadas de herramientas de configuración (de las cuales algunas se discutieron en detalle en PEP), y un instalador básico inspirado en pip. El nombre real que usa para importar Distutils2 está 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 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.