Ich versuche, eine meiner virtuellen Umgebungen zu reparieren. Ich möchte alle installierten Bibliotheken auf diejenigen zurücksetzen, die der Produktion entsprechen.
Gibt es eine schnelle und einfache Möglichkeit, dies mit pip zu tun?
Ich versuche, eine meiner virtuellen Umgebungen zu reparieren. Ich möchte alle installierten Bibliotheken auf diejenigen zurücksetzen, die der Produktion entsprechen.
Gibt es eine schnelle und einfache Möglichkeit, dies mit pip zu tun?
Antworten:
Ich habe dieses Snippet als alternative Lösung gefunden. Es ist eine elegantere Entfernung von Bibliotheken als die Neuerstellung der virtuellen Umgebung:
pip freeze | xargs pip uninstall -y
Wenn Sie Pakete über VCS installiert haben, müssen Sie diese Zeilen ausschließen und die Pakete manuell entfernen (erhöht aus den Kommentaren unten):
pip freeze | grep -v "^-e" | xargs pip uninstall -y
postactivate
die bleiben werden.
pip freeze --exclude-editable | xargs pip uninstall -y
, um VCS-Pakete zu ignorieren, ohne ein Grep-Muster zu verwenden
Dies funktioniert für alle Mac-, Windows- und Linux-Systeme. So rufen Sie die Liste aller Pip-Pakete in der Datei "resources.txt" ab (Hinweis: Dadurch wird die Datei "require.txt" überschrieben, falls vorhanden, wird die neue Datei erstellt. Wenn Sie die alte Datei "require.txt" nicht ersetzen möchten, geben Sie einen anderen Dateinamen an im folgenden Befehl an Ort und Stelle anforderungs.txt).
pip freeze > requirements.txt
Nun eins nach dem anderen entfernen
pip uninstall -r requirements.txt
Wenn wir dann alles auf einmal entfernen wollen
pip uninstall -r requirements.txt -y
Wenn Sie an einem vorhandenen Projekt mit einer requirements.txt
Datei arbeiten und Ihre Umgebung abweicht, ersetzen Sie einfach requirements.txt
die obigen Beispiele durch toberemoved.txt
. Sobald Sie die obigen Schritte ausgeführt haben, können Sie mit die requirements.txt
Option Ihre jetzt saubere Umgebung aktualisieren.
Und für einen einzelnen Befehl, ohne eine Datei zu erstellen (wie von @joeb vorgeschlagen).
pip uninstall -y -r <(pip freeze)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
alles auf einmal erledigen.
Dies funktioniert mit der neuesten. Ich denke, es ist der kürzeste und aussagekräftigste Weg, dies zu tun.
virtualenv --clear MYENV
Aber normalerweise lösche ich einfach die virtuelle Umgebung und erstelle sie neu, da Unveränderlichkeitsregeln gelten!
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…
wipeenv
während in der Umgebung ein Fehler ausgelöst wird und nichts entfernt wird, wenn es im Kontext eines pip install -e
Entwicklungsbuilds verwendet wird. Der Versuch, es zu verwenden, virtualenv --clear MYENV
löst keinen Fehler aus und entfernt keinen der Fehler Pakete, die Sie möglicherweise zuvor in der Umgebung installiert haben. Zumindest ist dies unter OSX der Fall. Weitere Informationen finden Sie unter bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… .
wipeenv
ist ein Alias, der von virtualenvwrapper bereitgestellt wird, daher hat ihn nicht jeder.
Ich wollte diese Antwort aus einem Kommentarbereich herausheben, weil es eine der elegantesten Lösungen im Thread ist. Die volle Gutschrift für diese Antwort geht an @joeb .
pip uninstall -y -r <(pip freeze)
Dies funktionierte hervorragend für den Anwendungsfall, dass mein Benutzerpaketordner außerhalb des Kontexts einer virtuellen Umgebung gelöscht wurde, die in vielen der oben genannten Antworten nicht behandelt wird.
Bearbeiten: Weiß jemand, wie dieser Befehl in einem Makefile funktioniert?
Ich füge dies der Einfachheit halber meinem Bash-Profil hinzu:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Dann renne:
pipuninstallall
Wenn Sie Pipenv verwenden , können Sie einfach Folgendes ausführen:
pipenv uninstall --all
pip freeze
führt zu keiner Ausgabe, wenn keine Pakete installiert sind, und pip uninstall
beschwert sich dann leider).
<(...)
ist ein Bashismus. Sie können also entweder bash -c "..." verwenden oder herumarbeiten, indem Sie einenpip 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.
Andere Antworten, die else verwenden pip list
oder enthalten pip freeze
müssen,--local
deinstallieren auch Pakete, die sich in den allgemeinen Namespaces befinden.
Also hier ist der Ausschnitt, den ich regelmäßig benutze
pip freeze --local | xargs pip uninstall -y
Ref: 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.
. Dann konnte ich keine Module mehr deinstallieren.
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
) funktioniert hervorragend, bis Sie Pip versehentlich selbst deinstalliert haben -_-
Ich habe es folgendermaßen geschafft:
Erstellen Sie die Anforderungsdatei mit dem Namen reqs.txt mit der Liste der aktuell installierten Pakete
pip freeze > reqs.txt
Deinstallieren Sie dann alle Pakete von reqs.txt
pip uninstall \
-y # remove the package with prompting for confirmation
-r reqs.txt
Ich mag diese Methode, da Sie immer eine Pip-Anforderungsdatei haben, auf die Sie zurückgreifen können, wenn Sie einen Fehler machen. Es ist auch wiederholbar.
Der schnellste Weg ist, die virtuelle Umgebung komplett neu zu erstellen. Ich gehe davon aus, dass Sie eine request.txt-Datei haben, die der Produktion entspricht, wenn nicht:
# On production:
pip freeze > reqs.txt
# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
Unter Windows können Sie path
bei korrekter Konfiguration Folgendes verwenden:
pip freeze > unins && pip uninstall -y -r unins && del unins
Ähnlich sollte es bei Unix-ähnlichen Systemen sein:
pip freeze > unins && pip uninstall -y -r unins && rm unins
Nur eine Warnung, dass dies nicht vollständig ist, da Sie möglicherweise auf Probleme wie "Datei nicht gefunden" stoßen, aber in einigen Fällen trotzdem funktionieren können
BEARBEITEN: Aus Gründen der Übersichtlichkeit: unins
ist eine beliebige Datei, in die Daten geschrieben werden, wenn dieser Befehl ausgeführt wird:pip freeze > unins
Diese Datei, die sie wiederum geschrieben hat, wird dann verwendet, um die oben genannten Pakete mit impliziter Zustimmung / vorheriger Genehmigung über zu deinstallieren pip uninstall -y -r unins
Die Datei wird nach Abschluss endgültig gelöscht.
Es ist eine alte Frage, die ich kenne, aber ich bin darüber gestolpert, damit Sie sie zum späteren Nachschlagen jetzt tun können:
pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...
-r, --Anforderungsdatei
Deinstallieren Sie alle in der angegebenen Anforderungsdatei aufgeführten Pakete. Diese Option kann mehrfach verwendet werden.
aus der Pip-Dokumentation Version 8.1
(Hinzufügen als Antwort, da ich nicht genug Ruf habe, um die Antwort von @blueberryfields zu kommentieren)
Die Antwort von @blueberryfields funktioniert gut, schlägt jedoch fehl, wenn kein zu deinstallierendes Paket vorhanden ist (was ein Problem sein kann, wenn diese Option "Alle deinstallieren" Teil eines Skripts oder Makefiles ist). Dies kann gelöst werden, xargs -r
wenn die GNU-Version von xargs
:
pip freeze --exclude-editable | xargs -r pip uninstall -y
von man xargs
:
-r, --no-run-if-empty
Wenn die Standardeingabe keine Leerzeichen enthält, führen Sie den Befehl nicht aus. Normalerweise wird der Befehl einmal ausgeführt, auch wenn keine Eingabe erfolgt. Diese Option ist eine GNU-Erweiterung.
Dies war für mich der einfachste Weg, alle Python-Pakete zu deinstallieren.
from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
system("pip3 uninstall {} -y -q".format(i.key))
Plattformübergreifende Unterstützung nur durch Verwendung von 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.
Die einfache und robuste Art, plattformübergreifend und auch in Pipenv zu arbeiten, ist:
pip freeze
pip uninstall -r requirement
von pipenv:
pipenv run pip freeze
pipenv run pip uninstall -r requirement
Piplock oder Pipfile werden jedoch nicht aktualisiert
Wenn Sie laufen virtualenv
:
virtualenv --clear </path/to/your/virtualenv>
Wenn Ihre virtuelle Umgebung beispielsweise ist /Users/you/.virtualenvs/projectx
, würden Sie Folgendes ausführen:
virtualenv --clear /Users/you/.virtualenvs/projectx
Wenn Sie nicht wissen, wo sich Ihre virtuelle Umgebung befindet, können Sie sie which python
in einer aktivierten virtuellen Umgebung ausführen , um den Pfad abzurufen
In meinem Fall hatte ich versehentlich eine Reihe von Paketen weltweit mit einem pip
unter macOS installierten Homebrew installiert . Der einfachste Weg, zu den Standardpaketen zurückzukehren, war ein einfacher:
$ brew reinstall python
Oder wenn Sie verwendet haben pip3
:
$ brew reinstall python3
In der Befehlsshell von Windows
pip freeze | xargs pip uninstall -y
funktioniert der Befehl nicht. Für diejenigen unter Ihnen, die Windows verwenden, habe ich einen alternativen Weg gefunden, dies zu tun.
pip freeze
Befehl in eine TXT- Datei.pip uninstall -r *textfile.txt*
Wenn Sie verwenden pew
, können Sie den Befehl wipeenv verwenden :
pew wipeenv [env]
Ich verwende die Option --user, um alle auf der Benutzerseite installierten Pakete zu deinstallieren.
pip3 freeze --user | xargs pip3 deinstallieren -y
Pip kann nicht wissen, welche Pakete von ihm installiert wurden und welche Pakete vom Paketmanager Ihres Systems installiert wurden. Dafür müssten Sie so etwas tun
für RPM-basierte Distributionen (ersetzen Sie python2.7 durch Ihre Python-Version, mit der Sie pip installiert haben):
find /usr/lib/python2.7/ |while read f; do
if ! rpm -qf "$f" &> /dev/null; then
echo "$f"
fi
done |xargs rm -fr
für eine deb-basierte Distribution:
find /usr/lib/python2.7/ |while read f; do
if ! dpkg-query -S "$f" &> /dev/null; then
echo "$f"
fi
done |xargs rm -fr
um dann die verbleibenden leeren Verzeichnisse zu bereinigen:
find /usr/lib/python2.7 -type d -empty |xargs rm -fr
Ich fand die Top-Antwort sehr irreführend, da sie alle (die meisten?) Python-Pakete aus Ihrer Distribution entfernt und Sie wahrscheinlich mit einem kaputten System zurücklässt.
dpkg-query -S '/usr/lib/python2.7/*'
die Namen und dpkg-query -L
jeden Namen extrahieren , um die zugehörigen Dateien zu sichern? Es hat bereits die Manifeste vorbereitet. Mein Hauptargument ist, dass Sie nicht auf Pakete abzielen, die irgendwo anders als per Pip installiert sind, sondern auf Pakete, die von etwas anderem als dem von Ihnen erwarteten Manager installiert wurden, und an einem Ort, den Pip im Allgemeinen nicht berühren sollte. pip list -l
listet die lokal installierten Pakete auf, und einige werden es sogar tun pip install --target=...
. Wenn Sie alle derzeit leeren Verzeichnisse entfernen, werden Sie auch gebissen!