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?
@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 .
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):
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
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).
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:
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 freezedoivent inclure--local else désinstalleront également les packages qui se trouvent dans les espaces de noms communs.
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
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.
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
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:
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
(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:
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.
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))
Prise en charge multiplateforme en utilisant uniquement pip:
#!/usr/bin/env pythonfrom sys import stderr
from pip.commands.uninstall importUninstallCommandfrom pip import get_installed_distributions
pip_uninstall =UninstallCommand()
options, args = pip_uninstall.parse_args([
package.project_name
for package in
get_installed_distributions()ifnot package.location.endswith('dist-packages')])
options.yes =True# Don't confirm before uninstall# set `options.require_venv` to True for virtualenv restrictiontry:print pip_uninstall.run(options, args)exceptOSErroras 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.
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:
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.
Copiez tous les noms des packages de pip installés de la pip freezecommande vers un fichier .txt .
Ensuite, accédez à l'emplacement de votre fichier .txt et exécutez la commandepip uninstall -r *textfile.txt*
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;doif! 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;doif! 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é.
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!
Réponses:
J'ai trouvé cet extrait de code comme solution alternative. C'est une suppression plus gracieuse des bibliothèques que de refaire le virtualenv:
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):
la source
postactivate
qui resteront.setuptools
paquet. J'ai résolu le problème en suivant les instructions ici: stackoverflow.com/questions/7446187/…pip freeze --exclude-editable | xargs pip uninstall -y
pour ignorer les packages VCS sans utiliser de modèle grepCela 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).
Maintenant, pour supprimer un par un
Si nous voulons tout supprimer en même temps,
Si vous travaillez sur un projet existant qui a un
requirements.txt
fichier et que votre environnement a divergé, remplacez simplementrequirements.txt
les exemples ci-dessus partoberemoved.txt
. Ensuite, une fois que vous avez suivi les étapes ci-dessus, vous pouvez utiliser lerequirements.txt
pour mettre à jour votre environnement désormais propre.Et pour une seule commande sans créer de fichier (comme l'a suggéré @joeb).
la source
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
pour tout faire en une seule fois.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.
Mais généralement, je supprime et recrée le virtualenv depuis les règles d'immuabilité!
la source
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…wipeenv
que dans l'environnement génère une erreur et ne supprime rien s'il est utilisé dans le contexte d'unepip install -e
construction de développement, la tentative d'utilisationvirtualenv --clear MYENV
ne 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.wipeenv
est un alias fourni par virtualenvwrapper, donc tout le monde ne l'a pas.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 .
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é:
Exécutez ensuite:
Alternative pour pipenv
Si vous utilisez pipenv, vous pouvez simplement exécuter:
la source
pip freeze
n'y a rien de sortie si aucun paquet n'est installé, puis sepip uninstall
plaint, malheureusement).<(...)
est un bashisme. Vous pouvez donc soit utiliser bash -c "...", soit contourner en faisant unpip freeze | pip uninstall -r /dev/stdin
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.
Autres réponses qui utilisent
pip list
oupip 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
Réf:
pip freeze --help
la source
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.Méthode 1 (avec
pip freeze
)Méthode 2 (avec
pip list
)Méthode 3 (avec
virtualenv
)la source
pip list
) fonctionne très bien jusqu'à ce que pip se désinstalle accidentellement -_-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
puis désinstallez tous les packages de 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.
la source
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:
la source
Sous Windows, si votre
path
est correctement configuré, vous pouvez utiliser:Il devrait en être de même pour les systèmes de type Unix:
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.
la source
Utilisation de la fonction virtualenvwrapper :
Voir la documentation wipeenv
la source
wipeenv
Tout d'abord, ajoutez tous les packages à
requirements.txt
Ensuite, supprimez tout
la source
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:
de la documentation pip version 8.1
la source
Pour les utilisateurs de Windows, voici ce que j'utilise sur Windows PowerShell
la source
(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 -r
utilisation de la version GNU dexargs
:de
man xargs
:la source
Le cas peut être qu'il faut exécuter cette commande plusieurs fois pour obtenir un vide
pip3 freeze --local
.la source
C'était le moyen le plus simple pour moi de désinstaller tous les packages python.
la source
Prise en charge multiplateforme en utilisant uniquement
pip
:la source
Voici la commande qui fonctionne pour moi:
la source
la manière simple et robuste de multiplier les plates-formes et de travailler dans pipenv est:
par pipenv:
mais ne mettra pas à jour le piplock ou le fichier pip alors soyez conscient
la source
Si vous courez
virtualenv
:par exemple, si votre virtualenv est
/Users/you/.virtualenvs/projectx
, alors vous exécutez:si vous ne savez pas où se trouve votre env virtuel, vous pouvez exécuter à
which python
partir d'un env virtuel activé pour obtenir le cheminla source
Dans mon cas, j'avais accidentellement installé un certain nombre de packages dans le monde en utilisant un Homebrew installé
pip
sur macOS. Le moyen le plus simple de revenir aux packages par défaut était simple:Ou, si vous utilisiez
pip3
:la source
pip freeze
commande vers un fichier .txt .pip uninstall -r *textfile.txt*
la source
Si vous utilisez
pew
, vous pouvez utiliser la commande wipeenv :pew wipeenv [env]
la source
J'utilise l'option --user pour désinstaller tous les packages installés sur le site utilisateur.
la source
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):
pour une distribution basée sur deb:
puis pour nettoyer les répertoires vides restants:
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é.
la source
dpkg-query -S '/usr/lib/python2.7/*'
extraire les noms etdpkg-query -L
chaque 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 -l
répertorie les packages qu'il a installés localement, et certains le feront mêmepip install --target=...
. Supprimer tous les répertoires actuellement vides vous mordra aussi!