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?
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?
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:
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
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 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.txt
fichier et que votre environnement a divergé, remplacez simplement requirements.txt
les exemples ci-dessus par toberemoved.txt
. Ensuite, une fois que vous avez suivi les étapes ci-dessus, vous pouvez utiliser le requirements.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).
pip uninstall -y -r <(pip freeze)
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.
virtualenv --clear MYENV
Mais généralement, je supprime et recrée le virtualenv depuis les règles d'immuabilité!
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'une pip install -e
construction de développement, la tentative d'utilisation virtualenv --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 .
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?
J'ajoute ceci à mon profil bash pour plus de commodité:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Exécutez ensuite:
pipuninstallall
Si vous utilisez pipenv, vous pouvez simplement exécuter:
pipenv uninstall --all
pip freeze
n'y a rien de sortie si aucun paquet n'est installé, puis se pip 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
ou 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
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.
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
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
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
Sous Windows, si votre path
est 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.
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
(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 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.
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 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.
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
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 python
partir d'un env virtuel activé pour obtenir le chemin
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:
$ brew reinstall python
Ou, si vous utilisiez pip3
:
$ brew reinstall python3
Dans Command Shell de Windows, la commande
pip freeze | xargs pip uninstall -y
ne fonctionnera pas. Donc, pour ceux d'entre vous qui utilisent Windows, j'ai trouvé une autre façon de le faire.
pip freeze
commande vers un fichier .txt .pip uninstall -r *textfile.txt*
Si vous utilisez pew
, vous pouvez utiliser la commande wipeenv :
pew wipeenv [env]
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
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é.
dpkg-query -S '/usr/lib/python2.7/*'
extraire les noms et dpkg-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ême pip install --target=...
. Supprimer tous les répertoires actuellement vides vous mordra aussi!