Empaquetado del estado de Python: Buildout, Distribute, Distutils, EasyInstall, etc.
easy-install (5)
La última vez que tuve que preocuparme por instalar paquetes de Python fue hace dos años trabajando con Enthought , NumPy y MayaVi2 . Esa experiencia me dio pesadillas persistentes relacionadas con el comportamiento peculiar al instalar y actualizar los paquetes de Python en ubicaciones no estándar (en $HOME/usr/local2.6/
, por ejemplo).
De todos modos, mi trabajo me lleva a instalar varios paquetes de Python. ¡El tutorial CheeseShop menciona DistUtils y EasyInstall además de Buildout! Me cuesta mucho encontrar un lugar que compare estas (y otras) herramientas de instalación de PyPi, por lo que espero aprovechar la comunidad StackOverflow: ¿Cuáles son los puntos fuertes y débiles de cada herramienta de instalación?
Cada vez que necesito recordarme el estado del juego, veo esto como un punto de partida:
- El estado del embalaje de Python , una respuesta a:
- En envases , enlazados desde:
- Herramientas del pirata informático moderno de Python
En primer lugar, independientemente de la herramienta de instalación que decida, comience a usar virtualenv --no-site-packages
! De esa manera, los paquetes de Python no se instalan globalmente y puede volver fácilmente a donde estaba en proyectos antiguos y nuevos.
Ahora, su comparación es un poco de manzanas a peras, ya que las herramientas que enumera no se excluyen mutuamente. Sin embargo, puedo recomendar totalmente Buildout. Instalará paquetes de Python así como otras cosas y le permitirá automatizar la instalación y la implementación de proyectos (complejos).
Además, recomiendo buscar en Fabric como un medio para automatizar las tareas administrativas.
He investigado un poco sobre este tema (un par de semanas) antes de comenzar a utilizar buildout para todos mis proyectos.
DistUtils y EasyInstall además de Buildout!
La dificultad de crear un lugar para comparar todas estas herramientas es que todas forman parte de una misma cadena de herramientas y se usan juntas para crear un conjunto de herramientas predecible, confiable y flexible.
Por ejemplo, easy_install se utiliza para instalar paquetes de distribución desde pypi (cheeseshop) al directorio de paquetes de sitio de Python de su sistema. Esto simplifica drásticamente la instalación de paquetes a su sistema / global sys.path.
easy_install es muy conveniente para paquetes que son consistentes para todos los proyectos. Pero, creo que prefiero usar la instalación fácil de instalación del sistema para instalar paquetes de los que los proyectos no dependen. Por ejemplo, github-cli que uso con cada proyecto, porque me permite interactuar con los problemas de Github del proyecto desde la línea de comandos. Uso esto con proyectos, pero es por conveniencia y el proyecto en sí no depende de este paquete.
Para la gestión de dependencias del proyecto, uso buildout . Buildout le permite indicar específicamente de qué versión de paquetes depende su proyecto. Prefiero buildout sobre pip-Requirements.txt porque buildout es declarativo. Con pip, instala los paquetes y al final del desarrollo genera el archivo Requirements.txt. Con Buildout por otro lado, modifica buildout.cfg antes de agregar el paquete egg a su proyecto. Esto me obliga a ser consciente de los paquetes que estoy agregando al proyecto.
Ahora, hay una cuestión de virtualenv . Una de las características más publicitadas de virtualenv es, obviamente, la opción --no-site-packages . No he encontrado que esta opción sea particularmente útil, porque uso buildout. Buildout administra el archivo sys.path e incluye solo los paquetes que pido que diga que incluya. También incluye todo en el sistema de paquetes de sitio de Python, pero como no tengo nada de lo que uso en los proyectos, nunca tengo conflictos.
También, encuentro que --no-site-packages solo dificulta mi proceso de desarrollo, porque algunos paquetes los instalo usando el sistema de empaquetado de mi sistema. Por lo general, cualquier cosa que tenga bibliotecas de C que deban compilarse, lo instalo a través del sistema de empaquetado del sistema.
En el archivo fabfile.py del proyecto, incluyo la función de prueba para probar la presencia de paquetes del sistema que instalo a través del administrador de paquetes del sistema.
En resumen, aquí es cómo uso estas herramientas:
El Administrador de paquetes del sistema (apt-get, yam, port, fink ...) Yo uso uno de estos para instalar las versiones de python que necesito en este sistema. También lo uso para instalar paquetes como lxml que incluyen bibliotecas c.
easy_install utilizo para instalar paquetes desde pypi que uso en todos los proyectos, pero los proyectos no dependen de estos paquetes.
buildout que utilizo para gestionar las dependencias de un proyecto.
En mi experiencia, este flujo de trabajo ha sido muy flexible, portátil y fácil de trabajar.
No puedo ayudarte fácilmente a encontrar la fuerza, pero puedo hacerlo un poco más difícil, ya que también depende de la plataforma que quieras usar.
Por ejemplo, si necesita instalar paquetes de Python en computadoras basadas en Gentoo (GNU / Liunx), puede usar g-pypi para crear ebuilds para todos los paquetes que usan distutils (más bien: un setup.py). De esa manera, se integran completamente en su sistema y se pueden agregar, actualizar y eliminar como todas sus otras herramientas. Pero, naturalmente, solo funciona para sistemas basados en Gentoo.
También puede usar yolk para conocer todos los paquetes instalados mediante easy_install en su sistema (no solo en Gentoo).
Cuando escribo código, simplemente uso distutils (porque me permite crear ebuilds de portage muy fácilmente) y, a veces, funciones de herramientas de configuración básicas u organizo mis programas para que la gente pueda descargarlos y ejecutarlos desde la carpeta del programa (lo ideal es desempaquetar el archivo fuente / clon) el repositorio en alguna parte). Esta no es la solución perfecta, pero hasta que el equipo central de python decida de qué manera quieren moverse, no quiero fijarme en un camino (ya) que podría desaparecer.
Distribute es una nueva bifurcación de setuptools
( easy_install
), que también debe considerarse. Incluso Guido lo recomienda .
Buildout es ortogonal al empaque, puede usar buildout con Distribuir .