Tengo un archivo de requisitos de pip que cambia durante el desarrollo.
¿Se pip
puede hacer desinstalar paquetes que no aparecen en el archivo de requisitos así como instalar aquellos que sí aparecen? ¿Existe un método estándar?
Esto permitiría que el archivo de requisitos de pip sea la lista canónica de paquetes, un enfoque 'si y solo si'.
Actualización : lo sugerí como una nueva característica en https://github.com/pypa/pip/issues/716
Respuestas:
La respuesta corta es no, no puedes hacer eso con pip.
fuente
pip uninstall -r requirements.txt
-y
al comando de @Ommit para evitar tener que presionar Y e ingresar muchas veces. Aprende de mis errores.pip uninstall -r requirements.txt
solo desinstalará las versiones en su requirements.txt. Si desinstala,boto3==1.10.0
por ejemplo,pip freeze
se mostraráboto3==1.0.1
si lo ha instalado (o alguna versión anterior) anteriormente.Esto debería desinstalar todo lo que no esté en requirements.txt:
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y
Aunque esto no funcionará del todo bien con paquetes instalados con
-e
, es decir, desde un repositorio git o similar. Para omitirlos, simplemente filtre los paquetes que comiencen con la-e
bandera:pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y
Entonces, obviamente:
Actualización para 2016: sin embargo, probablemente no quieras utilizar el enfoque anterior. Echa un vistazo
pip-tools
ypip-sync
que logran lo que probablemente estás buscando hacer de una manera mucho más sólida.https://github.com/nvie/pip-tools
Actualización para mayo de 2016:
Ahora también puede usar
pip uninstall -r requirements.txt
, sin embargo, esto logra básicamente lo contrario: desinstala todo enrequirements.txt
Actualización para mayo de 2019:
Echa un vistazo a pipenv . Han pasado muchas cosas en el mundo de la gestión de paquetes que hacen que este tipo de preguntas sea un poco obsoleto. Sin embargo, todavía estoy bastante feliz usando pip-tools.
fuente
project.config
archivo para Django en Elastic Beanstalk:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
. Ahora puedo deshacer los paquetes de pip sin reconstruir mi entorno con solo usar comentarios enrequirements.txt
. Esto me está ahorrando un tiempo de inactividad real. ¡Gracias!pip freeze
hace comentarios, pero algún día pueden agregarlo a la API y, si lo hacen, será válido. Si no lo hacen, entonces lo anterior no es una operación. El guión le permite usar stdin del comando anterior, en este caso, el guión le dice a grep que compare el contenido de requirements.txt con la salida depip freeze
(la salida depip freeze
en este contexto es sinónimo de stdin)No es una característica de
pip
, no. Si realmente desea algo así, puede escribir un script para comparar el resultadopip freeze
con el suyorequirements.txt
, pero probablemente sería más complicado de lo que vale la pena.Al usar
virtualenv
, es más fácil y confiable simplemente crear un entorno limpio y (re) instalar desderequirements.txt
, como:fuente
requirements.txt
), ¿por qué volvería a instalarse?Ahora puede pasar el
-r requirements.txt
argumento apip uninstall
.Al menos a partir de
pip
8.1.2,pip help uninstall
muestra:... Uninstall Options: -r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be used multiple times. ...
fuente
Esta es una pregunta antigua (pero buena) y las cosas han cambiado sustancialmente desde que se planteó.
Hay una referencia informal a
pip-sync
en otra respuesta, pero merece su propia respuesta, porque resuelve precisamente el problema del OP.pip-sync toma un
requirements.txt
archivo como entrada y "ajusta" su entorno Python actual para que coincida exactamente con lo que contienerequirements.txt
. Esto incluye eliminar cualquier paquete que esté presente en su entorno pero ausenterequirements.txt
.Ejemplo: Supongamos que queremos que nuestro env para contener (sólo) 3: bibliotecas
libA
,libB
ylibC
, así:> cat requirements.txt libA==1.0 libB==1.1 libC==1.2
Pero nuestro env contiene actualmente
libC
ylibD
:> pip freeze libC==1.2 libD==1.3
Ejecutar pip-sync resultará en esto, que era nuestro estado final deseado:
> pip-sync requirements.txt > pip freeze libA==1.0 libB==1.1 libC==1.2
fuente
La propuesta de Stephen es una buena idea, pero desafortunadamente no funciona si solo incluye requisitos directos en su archivo, lo que me suena más limpio.
Se desinstalarán todas las dependencias, incluso
distribute
, se descompondrápip
.Mantener un archivo de requisitos limpio mientras la versión rastrea un entorno virtual
Así es como trato de rastrear la versión de mi entorno virtual. Intento mantener un mínimo
requirements.txt
, incluidos solo los requisitos directos, y ni siquiera mencionar las restricciones de versión donde no estoy seguro.Pero además, guardo e incluyo en el seguimiento de versiones (digamos git), el estado real de mi virtualenv en un
venv.pip
archivo.Aquí hay un flujo de trabajo de muestra:
configurar el espacio de trabajo virtualenv, con seguimiento de versiones:
inicializar el sistema de seguimiento de versiones:
git init echo venv > .gitignore pip freeze > venv.pip git add .gitignore venv.pip git commit -m "Python project with venv"
instale un paquete con dependencias, inclúyalo en el archivo de requisitos:
Ahora comience a construir su aplicación, luego confirme y comience una nueva rama:
vim myapp.py git commit -am "Simple flask application" git checkout -b "experiments"
instalar un paquete adicional:
... juega con él y luego vuelve a la versión anterior
vim manage.py git commit -am "Playing with flask-script" git checkout master
Ahora desinstale los paquetes extraños:
Supongo que el proceso se puede automatizar con git hooks, pero no salgamos del tema.
Por supuesto, entonces tiene sentido usar algún sistema de almacenamiento en caché de paquetes o repositorio local como pip2pi
fuente
A cuestas @ stephen-j-fuhry aquí hay un equivalente de PowerShell que uso:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
fuente
Si bien esto no responde directamente a la pregunta, una mejor alternativa a
requirements.txt
ahora es usar unPipfile
. Esto funciona de manera similar a RubyGemfile
. Actualmente, necesita hacer uso de lapipenv
herramienta, pero es de esperar que esto finalmente se incorpore apip
. Esto proporciona elpipenv clean
comando que hace lo que quiere.(Tenga en cuenta que puede importar un existente
requirements.txt
conpipenv install -r requirements.txt
. Después de esto, debería tener unPipfile
yrequirements.txt
se puede eliminar).fuente
Ahora es posible usar:
fuente