¿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?


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

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)

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!


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

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


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

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.


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

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.



14

Primero, agregue todo el paquete a requirements.txt

pip freeze > requirements.txt

Luego elimine todo

pip uninstall -y -r requirements.txt 

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


8

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

 pip uninstall -y (pip freeze)

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.


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.


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))

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.

2

Este es el comando que funciona para mí:

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

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


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


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

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*


1

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

pip3 congelar --usuario | xargs pip3 desinstalar -y


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.