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 2to3
automá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 ...)
Respuestas:
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:
distutils
sigue siendo la herramienta estándar para empaquetar en Python. Se incluye en la biblioteca estándar (Python 2 y Python 3). Es útil para distribuciones simples de Python, pero carece de características. Presenta eldistutils
paquete Python que se puede importar en susetup.py
script.distutils
sección de la Guía del usuario del paquete Pythonsetuptools
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 llamadaeasy_install
. También introdujo elsetuptools
paquete Python que se puede importar en susetup.py
script, y elpkg_resources
paquete 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 eldistutils
paquete Python. Debería funcionar bien conpip
. Ve lanzamientos regulares.setuptools
sección de la Guía del usuario del paquete Pythonscikit-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 se basa en distutils, en realidad 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 conpip
.scikit-build
sección de la Guía del usuario del paquete Pythondistlib
es una biblioteca que proporciona funcionalidad utilizada por herramientas de nivel superior comopip
.distlib
sección de la Guía del usuario del paquete Pythonpackaging
también es una biblioteca que proporciona funcionalidad utilizada por herramientas de nivel superior comopip
ysetuptools
packaging
sección de la Guía del usuario del paquete PythonHerramientas obsoletas / abandonadas:
distribute
fue un tenedor desetuptools
. Compartía el mismo espacio de nombres, por lo que si tuviera instalado Distribute, enimport setuptools
realidad 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.distutils2
fue un intento de tomar lo mejor dedistutils
,setuptools
ydistribute
y convertirse en la herramienta estándar incluida en la biblioteca estándar de Python. La idea era quedistutils2
se distribuiría para las versiones antiguas de Python, y quedistutils2
se renombraríapackaging
para Python 3.3, que lo incluiría en su biblioteca estándar. Sin embargo, estos planes no salieron según lo previsto, y actualmentedistutils2
es 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
,setuptools
ydistutils2
.Recomendación:
Si todo esto es nuevo para usted, y no sabe por dónde comenzar, recomendaría aprender
setuptools
, junto conpip
yvirtualenv
, que funcionan muy bien juntos.Si usted está buscando en
virtualenv
, que podría estar interesado en esta pregunta: ¿Cuál es la diferencia entrevenv
,pyvenv
,pyenv
,virtualenv
,virtualenvwrapper
, etc? . (Sí, lo sé, gimo contigo)fuente
'Distribute' is a now deprecated fork of the 'Setuptools' project.
@ PyPI Distribuir página.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áDistutils2 no realizó la versión Python 3.3, y se puso en espera.packaging
en la biblioteca estándar Python 3.3+, odistutils2
en 2.4+ y 3.1–3.2. (Un backport estará disponible pronto).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.
fuente
share
botón).distribute
recientemente se fusionó nuevamentesetuptools
. El hecho de que gran parte de la información está desactualizada aumenta la confusiónNOTA: 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í.
fuente
Me doy cuenta de que he respondido a su pregunta secundaria sin abordar suposiciones incuestionables en su problema original:
Puede que no lo necesite . Otras estrategias se describen en http://docs.python.org/dev/howto/pyporting
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
fuente
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:
Ese último punto es especialmente importante si estás en el campo de la computación científica.
fuente