¿Cuál es la forma más fácil de eliminar todos los paquetes instalados por pip?

616

Estoy tratando de arreglar uno de mis virtualenvs: me gustaría restablecer todas las bibliotecas instaladas a las que coinciden con la producción.

¿Hay una manera rápida y fácil de hacer esto con pip?

blueberryfields
fuente
10
@patelshahrukh desinstalar python NO elimina los paquetes pip. favor EVITAR hacer eso, ya que tanto más probable es que no va a funcionar de la manera que creo que sí, y , dependiendo de la forma de instalar Python de nuevo, puede dejar el equipo en un estado inestable que es más trabajo para arreglar .
blueberryfields
Esto podría ayudar a los paquetes instalados en modo de desarrollo o modo editable: stackoverflow.com/questions/17346619/…
Charlie Parker

Respuestas:

926

He encontrado este fragmento como una solución alternativa. Es una eliminación más elegante de bibliotecas que rehacer virtualenv:

pip freeze | xargs pip uninstall -y

En caso de que tenga paquetes instalados a través de VCS, debe excluir esas líneas y eliminar los paquetes manualmente (elevado de los comentarios a continuación):

pip freeze | grep -v "^-e" | xargs pip uninstall -y
blueberryfields
fuente
44
Considero que esta es una buena solución, simplemente porque no elimina por completo el entorno virtual; es posible que haya realizado cambios en, por ejemplo, los postactivateque permanecerán.
niceguydave
55
Después de ejecutar esto, me di cuenta de que eliminó el setuptoolspaquete. Resolví el problema siguiendo las instrucciones aquí: stackoverflow.com/questions/7446187/…
Dan
1
@ gerty3000 sí, esto (como pregunta la pregunta) eliminará todos los paquetes instalados en un entorno virtual. en su entorno, ¿tal vez sería mejor instalar setuptools en una ubicación global?
blueberryfields
77
También puede usar pip freeze --exclude-editable | xargs pip uninstall -ypara ignorar los paquetes de VCS sin usar un patrón grep
Connor Brinton
2
Y para desinstalar paquetes editables, consulte stackoverflow.com/questions/17346619
Dan Oak
318

Esto funcionará para todos los sistemas Mac, Windows y Linux. Para obtener la lista de todos los paquetes de pip en el archivo require.txt (Nota: esto sobrescribirá a require.txt si existe, creará uno nuevo, también si no desea reemplazar los viejos requisitos.txt, entonces asigne un nombre de archivo diferente en todos los siguientes comandos en el lugar requisitos.txt).

pip freeze > requirements.txt

Ahora para eliminar uno por uno

pip uninstall -r requirements.txt

Si queremos eliminar todo de una vez, entonces

pip uninstall -r requirements.txt -y

Si está trabajando en un proyecto existente que tiene un requirements.txtarchivo y su entorno ha divergido, simplemente reemplace requirements.txtde los ejemplos anteriores con toberemoved.txt. Luego, una vez que haya seguido los pasos anteriores, puede usar requirements.txtpara actualizar su entorno ahora limpio.

Y para un solo comando sin crear ningún archivo (como sugirió @joeb).

pip uninstall -y -r <(pip freeze)
Harshad Kavathiya
fuente
11
Probablemente valga la pena mencionar que está forzando a sobrescribir su archivo require.txt, en caso de que no lo supieran. :)
Dave Gregory
44
Además, si se desea eliminar todos los paquetes, se agregará "-y". Ejemplo:pip uninstall -r requirements.txt -y
David Metcalfe el
58
Puedes usar pip uninstall -y -r <(pip freeze)para hacer todo de una vez.
joeb
1
@joeb sí, también podemos hacerlo de esa manera.
Harshad Kavathiya
1
@HarshadKavathiya puede usar otro archivo para almacenar el congelamiento de pip, como "current.txt", por lo que
require.txt
118

Esto funciona con lo último. Creo que es la forma más corta y declarativa de hacerlo.

virtualenv --clear MYENV

¡Pero generalmente solo borro y recreo el virtualenv ya que las reglas de inmutabilidad!

Robert Moskal
fuente
77
¿Es esto efectivamente lo mismo que correr wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
Taylor Edmiston
En realidad, parece (por lo que acabo de encontrar), mientras wipeenvque dentro del entorno arroja un error y no elimina nada si se usa en el contexto de una pip install -ecompilación de desarrollo, intentar usar virtualenv --clear MYENVno arroja un error y no elimina ninguno de los paquetes que puede haber instalado previamente en el entorno. Al menos este es el caso en OSX. Ver bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… para más información.
mpacer
2
wipeenves un alias proporcionado por virtualenvwrapper, por lo que no todos lo tienen.
Jonathan Hartley
2
bueno, este es un truco sucio, pero funciona como magia. Preferiría que todos usen la desinstalación de pip -r require.txt -y. Hace una gran limpieza.
Muema
84

Quería elevar esta respuesta de una sección de comentarios porque es una de las soluciones más elegantes del hilo. El crédito completo por esta respuesta va a @joeb .

pip uninstall -y -r <(pip freeze)

Esto funcionó muy bien para mí para el caso de uso de borrar mi carpeta de paquetes de usuario fuera del contexto de un virtualenv que muchas de las respuestas anteriores no manejan.

Editar: ¿Alguien sabe cómo hacer que este comando funcione en un Makefile?

Bonus: un alias bash

Agrego esto a mi perfil de bash por conveniencia:

alias pipuninstallall="pip uninstall -y -r <(pip freeze)"

Entonces corre:

pipuninstallall

Alternativa para pipenv

Si está utilizando pipenv , puede ejecutar:

pipenv uninstall --all
Taylor Edmiston
fuente
8
Debería ser fácilmente el número 1
Marque
Me gusta, pero no funciona en el caso nulo (no se pip freezegenera ningún resultado si no hay paquetes instalados y pip uninstall, lamentablemente, se queja).
Eric G
Hmm buena captura. Quizás podría incluirse en una función bash que verifique si la salida de congelación de pip no está vacía. No veo una gran manera de lograrlo mientras mantengo el comando como un breve resumen.
Taylor Edmiston
1
make usa sh por defecto, pero la sintaxis de sustitución <(...)es un bashism. Entonces puede usar bash -c "...", o trabajar haciendo unpip freeze | pip uninstall -r /dev/stdin
César
No funciona con los portátiles de Azure:ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
SeaDude
54

Otras respuestas que usan pip listo pip freeze deben incluir--local más también desinstalarán los paquetes que se encuentran en los espacios de nombres comunes.

Así que aquí están los fragmentos que uso regularmente

 pip freeze --local | xargs pip uninstall -y

Árbitro: pip freeze --help

nehem
fuente
Buena respuesta ... funcionó para mí
igorkf
Esto funcionó hasta que llegó a un paquete que produce este error: ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.. Entonces no pude desinstalar más módulos.
SeaDude
39

Método 1 (con pip freeze)

pip freeze | xargs pip uninstall -y

Método 2 (con pip list)

pip list | awk '{print $1}' | xargs pip uninstall -y

Método 3 (con virtualenv)

virtualenv --clear MYENV
Suriyaa
fuente
2
sudo no es necesario, y probablemente sea peligroso de usar sin una cuidadosa consideración, ya que afecta la configuración global de la máquina. vea esta respuesta, por ejemplo: stackoverflow.com/questions/15028648/…
blueberryfields
66
Método 2 ( pip list) funciona muy bien hasta que pip se desinstale accidentalmente a sí mismo -_-
Justin
20

Lo logré haciendo lo siguiente:

Cree el archivo de requisitos llamado reqs.txt con la lista de paquetes actualmente instalados

pip freeze > reqs.txt

luego desinstale todos los paquetes de reqs.txt

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

Me gusta este método, ya que siempre tiene un archivo de requisitos de pip en el que recurrir si comete un error. También es repetible.

Prime By Design
fuente
Simple y elegante, funciona como encanto
Satyaaditya
19

La forma más rápida es rehacer el virtualenv por completo. Supongo que tiene un archivo require.txt que coincide con la producción, si no:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
Ned Batchelder
fuente
2
¿Esto incluso maneja el caso donde hubo una instalación editable (básicamente una instalación en modo de desarrollo de herramientas de configuración) que creó un archivo .egg-info local que luego interfirió con el resto del proceso de instalación / desinstalación? Como se trata de un conjunto de archivos, no parece saber cómo manejar su presencia, y en lugar de desinstalar nada, completa una estructura de directorio local en MYENV con: `> Nuevos ejecutables de Python en MYENV / bin / python3.4> También crear ejecutable en MYENV / bin / python> Instalar setuptools, pip, wheel ... hecho. ¡Pero MYENV no ha restablecido el entorno!
mpacer
16

En Windows, si pathestá configurado correctamente, puede usar:

pip freeze > unins && pip uninstall -y -r unins && del unins

Debería ser un caso similar para sistemas tipo Unix:

pip freeze > unins && pip uninstall -y -r unins && rm unins

Solo una advertencia de que esto no es completamente sólido, ya que puede encontrarse con problemas como 'Archivo no encontrado', pero puede funcionar en algunos casos

EDITAR: Para mayor claridad: uninses un archivo arbitrario que tiene datos escritos cuando se ejecuta este comando:pip freeze > unins

Ese archivo que escribió a su vez se usa para desinstalar los paquetes antes mencionados con consentimiento implícito / aprobación previa a través de pip uninstall -y -r unins

El archivo finalmente se elimina al finalizar.

Richard Kenneth Niescior
fuente
14

Usando la función virtualenvwrapper :

wipeenv

Ver documentación de wipeenv

zesk
fuente
66
Si está utilizando virtualenvwrapper, escribawipeenv
raratiru
@raratiru, genial, ahora mis compañeros de trabajo probablemente se pregunten por qué solo escupí café en mi teclado
Brian Joseph
@BrianJoseph ¡Maldición! Me caí de la silla ... ¡gracias!
raratiru
14

Primero, agregue todo el paquete a requirements.txt

pip freeze > requirements.txt

Luego elimine todo

pip uninstall -y -r requirements.txt 
shafik
fuente
9

Es una vieja pregunta que conozco, pero me topé con ella, así que para futuras referencias, ahora puede hacer esto:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r, --archivo de requisitos

Desinstale todos los paquetes enumerados en el archivo de requisitos dado. Esta opción se puede usar varias veces.

de la documentación de pip versión 8.1

Craicerjack
fuente
8

Para los usuarios de Windows, esto es lo que uso en Windows PowerShell

 pip uninstall -y (pip freeze)
Benwrk
fuente
6

(agregando esto como respuesta, porque no tengo suficiente reputación para comentar sobre la respuesta de @blueberryfields)

La respuesta de @blueberryfields funciona bien, pero falla si no hay un paquete para desinstalar (lo que puede ser un problema si este "desinstalar todo" es parte de un script o archivo MAKE). Esto se puede resolver con xargs -rla versión de GNU de xargs:

pip freeze --exclude-editable | xargs -r pip uninstall -y

de man xargs:

-r, --no-run-if-empty

Si la entrada estándar no contiene espacios en blanco, no ejecute el comando. Normalmente, el comando se ejecuta una vez, incluso si no hay entrada. Esta opción es una extensión GNU.

Thibaut Dubernet
fuente
6
pip3 freeze --local | xargs pip3 uninstall -y

El caso podría ser que uno tiene que ejecutar este comando varias veces para obtener un vacío pip3 freeze --local.

obotezat
fuente
3

Esta fue la forma más fácil para mí de desinstalar todos los paquetes de Python.

from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
    system("pip3 uninstall {} -y -q".format(i.key))
Anónimo 138
fuente
2

Soporte multiplataforma utilizando solo pip:

#!/usr/bin/env python

from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions

pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
    package.project_name
    for package in
    get_installed_distributions()
    if not package.location.endswith('dist-packages')
])

options.yes = True  # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction

try:
    print pip_uninstall.run(options, args)
except OSError as e:
    if e.errno != 13:
        raise e
    print >> stderr, "You lack permissions to uninstall this package.
                      Perhaps run with sudo? Exiting."
    exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.
Samuel Marks
fuente
2

Este es el comando que funciona para mí:

pip list | awk '{print $1}' | xargs pip uninstall -y
Fei Xie
fuente
2

La manera fácil y robusta multiplataforma y trabajo en pipenv también es:

pip freeze 
pip uninstall -r requirement

por pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

pero no actualizará piplock o pipfile, así que ten en cuenta

Mahdi Hamzeh
fuente
1

Si estás corriendo virtualenv:

virtualenv --clear </path/to/your/virtualenv>

por ejemplo, si tu virtualenv es /Users/you/.virtualenvs/projectx, entonces ejecutarías:

virtualenv --clear /Users/you/.virtualenvs/projectx

si no sabe dónde se encuentra su entorno virtual, puede ejecutarlo which pythondesde un entorno virtual activado para obtener la ruta

punkrockpolly
fuente
1

En mi caso, accidentalmente instalé varios paquetes a nivel mundial utilizando un Homebrew instalado pipen macOS. La forma más fácil de volver a los paquetes predeterminados fue simple:

$ brew reinstall python

O, si estuvieras usando pip3:

$ brew reinstall python3
Radon Rosborough
fuente
Esta respuesta supone demasiado sobre el entorno y no resuelve directamente el problema si está utilizando pyenv, por ejemplo.
Mark
@ Mark Bueno, seguro que si estás usando pyenv, entonces deberías hacer algo diferente. En el caso común de que no lo sea, creo que esta es la solución más simple y menos hacky. Tenga en cuenta que esta condición se establece explícitamente al comienzo de la respuesta.
Radon Rosborough
El OP preguntó sobre virtualenvs. No mencionó específicamente el uso de una Mac o una cerveza para instalar Python. Por lo tanto, no puede asumir que se utilizó el sistema operativo o la preparación, y esta respuesta no resolverá TODAS las condiciones. Si se enfoca en resolver el medio ambiente utilizando una herramienta como pip, abordará el contexto del entorno en el que se encuentra. Espero que tenga sentido.
Mark
1
@ Mark, entiendo tu posición. Podemos estar de acuerdo en no estar de acuerdo. Solo quiero ayudar a las personas de Google que hacen clic en un enlace llamado "¿Cuál es la forma más fácil de eliminar todos los paquetes instalados por pip?" cuando realmente quieren eliminar todos los paquetes instalados globalmente por pip.
Radon Rosborough
De acuerdo con @RadonRosborough, el título del enlace es representativo de por qué llegué aquí, incluso si el OP no hace la misma pregunta.
Kenn Sebesta
1

En Command Shell de Windows, el comando pip freeze | xargs pip uninstall -yno funcionará. Entonces, para aquellos de ustedes que usan Windows, he descubierto una forma alternativa de hacerlo.

  1. Copie todos los nombres de los paquetes de pip instalados desde el pip freezecomando a un archivo .txt .
  2. Luego, vaya a la ubicación de su archivo .txt y ejecute el comandopip uninstall -r *textfile.txt*
Sushant Chaudhary
fuente
1

Si está usando pew, puede usar el comando wipeenv :

pew wipeenv [env]

Mohammad Banisaeid
fuente
1

Uso la opción --user para desinstalar todos los paquetes instalados en el sitio del usuario.

pip3 congelar --usuario | xargs pip3 desinstalar -y

Decano
fuente
Creo que esta respuesta no agrega mucha información nueva, preferiría haber sugerido una mejora a otra respuesta similar ya existente como esta: stackoverflow.com/a/45475070/11138259
sinoroc
-1

Pip no tiene forma de saber qué paquetes fueron instalados por él y qué paquetes fueron instalados por el administrador de paquetes de su sistema. Para esto necesitarías hacer algo como esto

para distribuciones basadas en rpm (reemplace python2.7 con su versión de python con la que instaló pip):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

para una distribución basada en deb:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

luego para limpiar los directorios vacíos sobrantes:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

La respuesta principal me pareció muy engañosa, ya que eliminará todos (¿la mayoría?) Los paquetes de Python de su distribución y probablemente lo dejará con un sistema roto.

Glenda
fuente
Con el debido respeto, esto parece comparable. ¿Por qué no dpkg-query -S '/usr/lib/python2.7/*', extraer los nombres y dpkg-query -Lcada nombre para volcar los archivos asociados? Ya tiene los manifiestos preparados. Mi principal objeción es que, en lugar de apuntar a paquetes instalados en cualquier lugar que no sea pip, ha apuntado paquetes instalados por cualquier otra cosa que no sea el administrador que espera, y en una ubicación que pip generalmente no debería tocar. pip list -lenumera los paquetes que instaló localmente, y algunos lo harán incluso pip install --target=.... ¡Eliminar todos los directorios actualmente vacíos también te morderá!
John P