python - dile a pip que instale las dependencias de los paquetes listados en un archivo de requisitos
requirements.txt (3)
¿Alguna forma de hacerlo sin tener que volver a instalar manualmente los paquetes en un nuevo virtualenv para obtener sus dependencias? Esto sería propenso a errores y me gustaría automatizar el proceso de limpieza de virtualenv de antiguas dependencias que ya no son necesarias.
Para eso está el paquete de pip-tools (de https://github.com/nvie/pip-tools ):
Instalación
$ pip install --upgrade pip # pip-tools needs pip==6.1 or higher (!)
$ pip install pip-tools
Ejemplo de uso para pip-compile
Supongamos que tiene un proyecto Flask y desea fijarlo para producción. Escriba la siguiente línea en un archivo:
# requirements.in
Flask
Ahora, ejecute los requisitos pip-compile.in:
$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# Make changes in requirements.in, then run this to update:
#
# pip-compile requirements.in
#
flask==0.10.1
itsdangerous==0.24 # via flask
jinja2==2.7.3 # via flask
markupsafe==0.23 # via jinja2
werkzeug==0.10.4 # via flask
Y generará su requirements.txt
, con todas las dependencias de Flask (y todas las dependencias subyacentes) ancladas. Ponga este archivo también bajo control de versión y periódicamente vuelva a ejecutar pip-compile
para actualizar los paquetes.
Ejemplo de uso para pip-sync
Ahora que tiene un requirements.txt
, puede usar pip-sync
para actualizar su entorno virtual y reflejar exactamente lo que hay allí. Nota: esto instalará / actualizará / desinstalará todo lo necesario para que coincida con el contenido de requirements.txt
.
$ pip-sync
Uninstalling flake8-2.4.1:
Successfully uninstalled flake8-2.4.1
Collecting click==4.1
Downloading click-4.1-py2.py3-none-any.whl (62kB)
100% |████████████████████████████████| 65kB 1.8MB/s
Found existing installation: click 4.0
Uninstalling click-4.0:
Successfully uninstalled click-4.0
Successfully installed click-4.1
Desarrollando una aplicación web de Django, tengo una lista de paquetes que necesito instalar en un virtual. Decir:
Django==1.3.1
--extra-index-url=http://dist.pinaxproject.com/dev/
Pinax==0.9b1.dev10
git+git://github.com/pinax/pinax-theme-bootstrap.git@cff4f5bbe9f87f0c67ee9ada9aa8ae82978f9890
# and other packages
Inicialmente los instalé manualmente, uno por uno, a lo largo del desarrollo. Esto instaló las dependencias requeridas y finalmente usé pip freeze
antes de implementar la aplicación.
El problema es que, al actualizar algunos paquetes, algunas dependencias ya no se usan ni se requieren, pero siguen apareciendo en la lista por pip freeze
.
Ahora, me gustaría configurar un nuevo virtualenv de esta manera:
- poner los paquetes necesarios (sin sus dependencias) en un archivo de requisitos,
comomanual-requirements.txt
- instalarlos con sus dependencias
pip install -r manual-requirement.txt
(problema ←, esto no instala las dependencias) - congelar el virtualenv completo
pip freeze -r manual-requirements.txt > full-requirements.txt
y desplegar.
¿Alguna forma de hacerlo sin tener que volver a instalar manualmente los paquetes en un nuevo virtualenv para obtener sus dependencias? Esto sería propenso a errores y me gustaría automatizar el proceso de limpieza de virtualenv de antiguas dependencias que ya no son necesarias.
editar: en realidad, pip instala dependencias que no figuran explícitamente en el archivo de requisitos, incluso si la documentación nos dice que dichos archivos son planos. Estaba equivocado sobre las dependencias que esperaba instalar. Dejaré esta pregunta para cualquier persona en duda sobre pip no instalando todas las dependencias.
Dado su comentario a la pregunta (donde dice que la ejecución de la instalación de un solo paquete funciona como se esperaba), le sugiero que haga un bucle sobre su archivo de requisitos. En bash:
#!/bin/sh
while read p; do
pip install $p
done < requirements.pip
HTH!
simplificadamente, use:
pip install -r requirement.txt
puede instalar todos los listados en el archivo de requisitos.