Quelle est la façon la plus simple de supprimer tous les packages installés par pip?

616

J'essaie de réparer l'un de mes virtualenvs - je voudrais réinitialiser toutes les bibliothèques installées à celles qui correspondent à la production.

Existe-t-il un moyen rapide et facile de le faire avec pip?

blueberryfields
la source
10
@patelshahrukh la désinstallation de python NE supprime PAS les packages pip. veuillez ÉVITER de faire cela, car cela ne fonctionnera probablement PAS comme vous le pensez et , selon la façon dont vous réinstallez python, peut laisser votre machine dans un état instable qui nécessite plus de travail à réparer .
blueberryfields
cela pourrait aider pour les packages installés en mode développement ou en mode modifiable: stackoverflow.com/questions/17346619/…
Charlie Parker

Réponses:

927

J'ai trouvé cet extrait de code comme solution alternative. C'est une suppression plus gracieuse des bibliothèques que de refaire le virtualenv:

pip freeze | xargs pip uninstall -y

Dans le cas où vous avez installé des packages via VCS, vous devez exclure ces lignes et supprimer les packages manuellement (selon les commentaires ci-dessous):

pip freeze | grep -v "^-e" | xargs pip uninstall -y
blueberryfields
la source
4
Je trouve que c'est une bonne solution, uniquement parce qu'elle ne supprime pas entièrement l'environnement virtuel - j'ai peut-être apporté des modifications, par exemple, postactivatequi resteront.
niceguydave
5
Après avoir exécuté cela, j'ai réalisé qu'il avait supprimé le setuptoolspaquet. J'ai résolu le problème en suivant les instructions ici: stackoverflow.com/questions/7446187/…
Dan
1
@ gerty3000 oui, cela supprimera (comme le demande la question) tous les packages installés dans un environnement virtuel. dans votre environnement, il serait peut-être préférable d'installer setuptools à un emplacement global?
blueberryfields
7
Vous pouvez également utiliser pip freeze --exclude-editable | xargs pip uninstall -ypour ignorer les packages VCS sans utiliser de modèle grep
Connor Brinton
2
Et pour désinstaller les packages modifiables, voir stackoverflow.com/questions/17346619
Dan Oak
318

Cela fonctionnera pour tous les systèmes Mac, Windows et Linux. Pour obtenir la liste de tous les packages pip dans le fichier requirements.txt (Remarque: cela remplacera requirements.txt s'il existe, sinon le nouveau sera créé, également si vous ne voulez pas remplacer l'ancien requirements.txt, puis donnez un nom de fichier différent dans la commande all in place requirements.txt).

pip freeze > requirements.txt

Maintenant, pour supprimer un par un

pip uninstall -r requirements.txt

Si nous voulons tout supprimer en même temps,

pip uninstall -r requirements.txt -y

Si vous travaillez sur un projet existant qui a un requirements.txtfichier et que votre environnement a divergé, remplacez simplement requirements.txtles exemples ci-dessus par toberemoved.txt. Ensuite, une fois que vous avez suivi les étapes ci-dessus, vous pouvez utiliser le requirements.txtpour mettre à jour votre environnement désormais propre.

Et pour une seule commande sans créer de fichier (comme l'a suggéré @joeb).

pip uninstall -y -r <(pip freeze)
Harshad Kavathiya
la source
11
vaut probablement la peine de mentionner que vous êtes obligé d'écraser leur fichier requirements.txt, au cas où ils ne le savaient pas. :)
Dave Gregory
4
De plus, si l'on veut supprimer tous les paquets, l'ajout de "-y" le fera. Exemple:pip uninstall -r requirements.txt -y
David Metcalfe
58
Vous pouvez utiliser pip uninstall -y -r <(pip freeze)pour tout faire en une seule fois.
joeb
1
@joeb oui, nous pouvons aussi faire de même.
Harshad Kavathiya
1
@HarshadKavathiya, vous pouvez utiliser un autre fichier pour stocker le gel de pip, comme "current.txt", afin que requirements.txt puisse rester
inchangé
118

Cela fonctionne avec la dernière version. Je pense que c'est la manière la plus courte et la plus déclarative de le faire.

virtualenv --clear MYENV

Mais généralement, je supprime et recrée le virtualenv depuis les règles d'immuabilité!

Robert Moskal
la source
7
Est-ce effectivement la même chose que courir wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
Taylor Edmiston
En fait - il semble (d'après ce que je viens de rencontrer) alors wipeenvque dans l'environnement génère une erreur et ne supprime rien s'il est utilisé dans le contexte d'une pip install -econstruction de développement, la tentative d'utilisation virtualenv --clear MYENVne génère pas d'erreur et ne supprime aucune des les packages que vous avez peut-être déjà installés dans l'environnement. C'est du moins le cas sur OSX. Voir bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… pour plus d'informations.
mpacer
2
wipeenvest un alias fourni par virtualenvwrapper, donc tout le monde ne l'a pas.
Jonathan Hartley
2
eh bien, c'est une sorte de sale tour, mais ça fonctionne comme par magie. Je préférerais que tout le monde utilise pip uninstall -r requirements.txt -y. Cela fait un grand nettoyage.
Muema
84

Je voulais élever cette réponse hors d'une section de commentaires parce que c'est l'une des solutions les plus élégantes du fil. Le mérite complet de cette réponse va à @joeb .

pip uninstall -y -r <(pip freeze)

Cela a très bien fonctionné pour moi dans le cas d'utilisation de la suppression de mon dossier de packages utilisateur en dehors du contexte d'un virtualenv que la plupart des réponses ci-dessus ne gèrent pas.

Edit: Quelqu'un sait comment faire fonctionner cette commande dans un Makefile?

Bonus: un alias bash

J'ajoute ceci à mon profil bash pour plus de commodité:

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

Exécutez ensuite:

pipuninstallall

Alternative pour pipenv

Si vous utilisez pipenv, vous pouvez simplement exécuter:

pipenv uninstall --all
Taylor Edmiston
la source
8
Devrait facilement être n ° 1
Mark
Je l'aime mais cela ne fonctionne pas dans le cas nul (il pip freezen'y a rien de sortie si aucun paquet n'est installé, puis se pip uninstallplaint, malheureusement).
Eric G
Hmm bonne prise. Peut-être qu'il pourrait être enveloppé dans une fonction bash qui vérifie si la sortie de gel pip n'est pas vide. Je ne vois pas un excellent moyen d'y parvenir tout en gardant la commande une belle ligne courte.
Taylor Edmiston
1
make utilise sh par défaut, mais la syntaxe de substitution <(...)est un bashisme. Vous pouvez donc soit utiliser bash -c "...", soit contourner en faisant unpip freeze | pip uninstall -r /dev/stdin
Caesar
Ne fonctionne pas avec les ordinateurs portables 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

Autres réponses qui utilisent pip listou pip freeze doivent inclure--local else désinstalleront également les packages qui se trouvent dans les espaces de noms communs.

Voici donc l'extrait que j'utilise régulièrement

 pip freeze --local | xargs pip uninstall -y

Réf: pip freeze --help

nehem
la source
Bonne réponse ... a fonctionné pour moi
igorkf
Cela a fonctionné jusqu'à ce qu'il a atteint un paquet qui a produit cette erreur: 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.. Ensuite, je ne pouvais plus désinstaller de modules.
SeaDude
39

Méthode 1 (avec pip freeze)

pip freeze | xargs pip uninstall -y

Méthode 2 (avec pip list)

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

Méthode 3 (avec virtualenv)

virtualenv --clear MYENV
Suriyaa
la source
2
sudo n'est pas nécessaire, et très probablement dangereux à utiliser sans un examen attentif, car il affecte la configuration globale de la machine. voir cette réponse par exemple: stackoverflow.com/questions/15028648/…
blueberryfields
6
La méthode 2 ( pip list) fonctionne très bien jusqu'à ce que pip se désinstalle accidentellement -_-
Justin
20

Je l'ai géré en procédant comme suit:

Créez le fichier d'exigences appelé reqs.txt avec la liste des packages actuellement installés

pip freeze > reqs.txt

puis désinstallez tous les packages de reqs.txt

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

J'aime cette méthode, car vous avez toujours un fichier d'exigences pip à utiliser si vous faites une erreur. C'est aussi reproductible.

Prime By Design
la source
Simple et élégant, fonctionne comme un charme
Satyaaditya
19

Le moyen le plus rapide est de refaire complètement le virtualenv. Je suppose que vous avez un fichier requirements.txt qui correspond à la production, sinon:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
Ned Batchelder
la source
2
Cela gère-t-il même le cas où une installation modifiable (essentiellement une installation en mode développement setuptools) a créé un fichier .egg-info local qui a ensuite interféré avec le reste du processus d'installation / désinstallation? Puisqu'il s'agit d'un ensemble de fichiers, il ne semble pas savoir comment gérer leur présence, et plutôt que de désinstaller quoi que ce soit, il crée une structure de répertoires locaux sous MYENV avec: `> Nouveaux exécutables python dans MYENV / bin / python3.4> Aussi création d'exécutable dans MYENV / bin / python> Installation de setuptools, pip, wheel ... done. »Mais MYENV n'a pas réinitialisé l'environnement!
mpacer
16

Sous Windows, si votre pathest correctement configuré, vous pouvez utiliser:

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

Il devrait en être de même pour les systèmes de type Unix:

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

Juste un avertissement que ce n'est pas complètement solide car vous pouvez rencontrer des problèmes tels que `` Fichier non trouvé '' mais cela peut néanmoins fonctionner dans certains cas

EDIT: Pour plus de clarté: unins est un fichier arbitraire qui contient des données écrites lorsque cette commande s'exécute:pip freeze > unins

Ce fichier qu'il a écrit à son tour est ensuite utilisé pour désinstaller les packages susmentionnés avec un consentement implicite / une approbation préalable via pip uninstall -y -r unins

Le fichier est finalement supprimé à la fin.

Richard Kenneth Niescior
la source
14

Utilisation de la fonction virtualenvwrapper :

wipeenv

Voir la documentation wipeenv

zesk
la source
6
Si vous utilisez virtualenvwrapper, tapezwipeenv
raratiru
@raratiru, super, maintenant mes collègues se demandent probablement pourquoi j'ai juste craché du café sur mon clavier
Brian Joseph
@BrianJoseph Damn! Je suis tombé du fauteuil ... merci!
raratiru
14

Tout d'abord, ajoutez tous les packages à requirements.txt

pip freeze > requirements.txt

Ensuite, supprimez tout

pip uninstall -y -r requirements.txt 
shafik
la source
9

C'est une vieille question que je connais, mais je suis tombée dessus, donc pour référence future, vous pouvez maintenant le faire:

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

-r, - fichier d'exigences

Désinstallez tous les packages répertoriés dans le fichier d'exigences donné. Cette option peut être utilisée plusieurs fois.

de la documentation pip version 8.1

Craicerjack
la source
8

Pour les utilisateurs de Windows, voici ce que j'utilise sur Windows PowerShell

 pip uninstall -y (pip freeze)
benwrk
la source
6

(en ajoutant ceci comme réponse, car je n'ai pas assez de réputation pour commenter la réponse de @blueberryfields)

La réponse de @blueberryfields fonctionne bien, mais échoue s'il n'y a pas de package à désinstaller (ce qui peut être un problème si ce "désinstaller tout" fait partie d'un script ou d'un makefile). Cela peut être résolu avec l' xargs -rutilisation de la version GNU de xargs:

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

de man xargs:

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

Si l'entrée standard ne contient pas de non-vides, n'exécutez pas la commande. Normalement, la commande est exécutée une fois même s'il n'y a pas d'entrée. Cette option est une extension GNU.

Thibaut Dubernet
la source
6
pip3 freeze --local | xargs pip3 uninstall -y

Le cas peut être qu'il faut exécuter cette commande plusieurs fois pour obtenir un vide pip3 freeze --local.

obotezat
la source
3

C'était le moyen le plus simple pour moi de désinstaller tous les packages 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))
Anonyme 138
la source
2

Prise en charge multiplateforme en utilisant uniquement 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
la source
2

Voici la commande qui fonctionne pour moi:

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

la manière simple et robuste de multiplier les plates-formes et de travailler dans pipenv est:

pip freeze 
pip uninstall -r requirement

par pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

mais ne mettra pas à jour le piplock ou le fichier pip alors soyez conscient

Mahdi Hamzeh
la source
1

Si vous courez virtualenv:

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

par exemple, si votre virtualenv est /Users/you/.virtualenvs/projectx, alors vous exécutez:

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

si vous ne savez pas où se trouve votre env virtuel, vous pouvez exécuter à which pythonpartir d'un env virtuel activé pour obtenir le chemin

punkrockpolly
la source
1

Dans mon cas, j'avais accidentellement installé un certain nombre de packages dans le monde en utilisant un Homebrew installé pipsur macOS. Le moyen le plus simple de revenir aux packages par défaut était simple:

$ brew reinstall python

Ou, si vous utilisiez pip3:

$ brew reinstall python3
Radon Rosborough
la source
Cette réponse suppose trop d'environnement et ne résout pas directement le problème si vous utilisez pyenv par exemple.
Mark
@Mark Bien sûr, si vous utilisez pyenv, vous devrez faire quelque chose de différent. Dans le cas courant où vous ne l'êtes pas, je pense que c'est la solution la plus simple et la moins hacky. Notez que cette condition est explicitement indiquée au début de la réponse.
Radon Rosborough
Le PO a posé des questions sur virtualenvs. Il n'a fait aucune mention spécifique de l'utilisation d'un Mac ou d'une infusion pour installer Python. Par conséquent, vous ne pouvez pas supposer que le système d'exploitation ou l'infusion a été utilisé - et cette réponse ne résoudra pas TOUTES les conditions. Si vous vous concentrez sur la résolution de l'environnement à l'aide d'un outil tel que pip - vous aborderez le contexte de l'environnement dans lequel vous vous trouvez. J'espère que cela a du sens.
Mark
1
@Mark Je comprends votre position. Nous pouvons accepter d'être en désaccord. Je veux juste aider les gens de Google qui cliquent sur un lien intitulé "Quelle est la façon la plus simple de supprimer tous les packages installés par pip?" quand ils veulent vraiment supprimer tous les packages installés globalement par pip.
Radon Rosborough
D'accord avec @RadonRosborough, le titre du lien est représentatif de la raison pour laquelle j'ai atterri ici, même si le PO ne pose pas réellement la même question.
Kenn Sebesta
1

Dans Command Shell de Windows, la commande pip freeze | xargs pip uninstall -yne fonctionnera pas. Donc, pour ceux d'entre vous qui utilisent Windows, j'ai trouvé une autre façon de le faire.

  1. Copiez tous les noms des packages de pip installés de la pip freezecommande vers un fichier .txt .
  2. Ensuite, accédez à l'emplacement de votre fichier .txt et exécutez la commandepip uninstall -r *textfile.txt*
Sushant Chaudhary
la source
1

Si vous utilisez pew, vous pouvez utiliser la commande wipeenv :

pew wipeenv [env]

Mohammad Banisaeid
la source
1

J'utilise l'option --user pour désinstaller tous les packages installés sur le site utilisateur.

pip3 freeze --utilisateur | désinstaller xargs pip3 -y

doyen
la source
Je crois que cette réponse n'ajoute pas beaucoup de nouvelles informations, j'aurais préféré suggérer une amélioration à une autre réponse similaire déjà existante comme celle-ci: stackoverflow.com/a/45475070/11138259
sinoroc
-1

Pip n'a aucun moyen de savoir quels packages ont été installés par lui et quels packages ont été installés par le gestionnaire de packages de votre système. Pour cela, vous devez faire quelque chose comme ça

pour les distributions basées sur rpm (remplacez python2.7 par la version de python avec laquelle vous avez installé pip):

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

pour une distribution basée sur 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

puis pour nettoyer les répertoires vides restants:

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

J'ai trouvé la réponse du haut très trompeuse car elle supprimera tous (la plupart?) Des paquets python de votre distribution et vous laissera probablement avec un système cassé.

glenda
la source
Avec tout le respect que je vous dois, cela semble comparable. Pourquoi ne pas dpkg-query -S '/usr/lib/python2.7/*'extraire les noms et dpkg-query -Lchaque nom pour vider les fichiers associés? Il a déjà préparé les manifestes. Ma principale objection est qu'au lieu de cibler les packages installés ailleurs que par pip, vous avez ciblé les packages installés par autre chose que le gestionnaire que vous attendez, et dans un emplacement que pip ne devrait généralement pas toucher. pip list -lrépertorie les packages qu'il a installés localement, et certains le feront même pip install --target=.... Supprimer tous les répertoires actuellement vides vous mordra aussi!
John P