Was ist der einfachste Weg, um alle von pip installierten Pakete zu entfernen?

614

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?

Blaubeerfelder
quelle
10
@patelshahrukh Deinstallation von Python entfernt keine Pip-Pakete. Bitte VERMEIDEN Sie dies, da beide höchstwahrscheinlich nicht so funktionieren , wie Sie es sich vorstellen , und je nachdem, wie Sie Python erneut installieren, Ihr Computer in einem instabilen Zustand belassen kann, dessen Behebung mehr Arbeit erfordert .
blueberryfields
Dies kann für Pakete hilfreich sein, die im Entwicklungsmodus oder im bearbeitbaren Modus installiert sind: stackoverflow.com/questions/17346619/…
Charlie Parker

Antworten:

924

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
Blaubeerfelder
quelle
4
Ich finde das eine gute Lösung, nur weil es die virtuelle Umgebung nicht vollständig entfernt - ich habe möglicherweise Änderungen an zB vorgenommen, postactivatedie bleiben werden.
Niceguydave
5
Nachdem ich dies ausgeführt hatte, stellte ich fest, dass das setuptoolsPaket entfernt wurde. Ich habe das Problem mit den folgenden Anweisungen behoben
Dan
1
@ gerty3000 Ja, dies wird (wie in der Frage gefragt) alle in einer virtuellen Umgebung installierten Pakete entfernen. Vielleicht sind Setuptools in Ihrer Umgebung besser an einem globalen Standort installiert?
Blueberryfields
7
Sie können auch verwenden pip freeze --exclude-editable | xargs pip uninstall -y, um VCS-Pakete zu ignorieren, ohne ein Grep-Muster zu verwenden
Connor Brinton
2
Informationen
Dan Oak
318

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.txtDatei arbeiten und Ihre Umgebung abweicht, ersetzen Sie einfach requirements.txtdie obigen Beispiele durch toberemoved.txt. Sobald Sie die obigen Schritte ausgeführt haben, können Sie mit die requirements.txtOption 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)
Harshad Kavathiya
quelle
11
Erwähnenswert ist wahrscheinlich, dass Sie die Datei "require.txt" zwangsweise überschreiben, falls sie es nicht wussten. :)
Dave Gregory
4
Wenn man außerdem alle Pakete entfernen möchte, wird "-y" angehängt. Beispiel:pip uninstall -r requirements.txt -y
David Metcalfe
58
Sie können pip uninstall -y -r <(pip freeze)alles auf einmal erledigen.
Joeb
1
@ Joeb ja das können wir auch so machen.
Harshad Kavathiya
1
@ HarshadKavathiya Sie können eine andere Datei verwenden, um Pip Freeze zu speichern, wie "current.txt", so dass Anforderungen.txt unberührt bleiben kann
Prost
118

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!

Robert Moskal
quelle
7
Ist das effektiv dasselbe wie Laufen wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
Taylor Edmiston
Eigentlich - es scheint (von dem, worauf ich gerade gestoßen bin), wipeenvwährend in der Umgebung ein Fehler ausgelöst wird und nichts entfernt wird, wenn es im Kontext eines pip install -eEntwicklungsbuilds verwendet wird. Der Versuch, es zu verwenden, virtualenv --clear MYENVlö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/… .
mpacer
2
wipeenvist ein Alias, der von virtualenvwrapper bereitgestellt wird, daher hat ihn nicht jeder.
Jonathan Hartley
2
Nun, das ist eine Art schmutziger Trick, funktioniert aber wie Magie. Ich würde es vorziehen, dass jeder pip uninstall -r require.txt -y verwendet. Es macht eine tolle Reinigung.
Muema
84

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?

Bonus: Ein Bash-Alias

Ich füge dies der Einfachheit halber meinem Bash-Profil hinzu:

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

Dann renne:

pipuninstallall

Alternative für pipenv

Wenn Sie Pipenv verwenden , können Sie einfach Folgendes ausführen:

pipenv uninstall --all
Taylor Edmiston
quelle
8
Sollte leicht # 1 sein
Mark
Ich mag es, aber es funktioniert nicht im Null-Fall ( pip freezeführt zu keiner Ausgabe, wenn keine Pakete installiert sind, und pip uninstallbeschwert sich dann leider).
Eric G
Hmm guter Fang. Möglicherweise könnte es in eine Bash-Funktion eingebunden werden, die prüft, ob die Pip-Freeze-Ausgabe nicht leer ist. Ich sehe keinen großartigen Weg, dies zu erreichen, während der Befehl ein schöner kurzer Einzeiler bleibt.
Taylor Edmiston
1
make verwendet standardmäßig sh, aber die Substitutionssyntax <(...)ist ein Bashismus. Sie können also entweder bash -c "..." verwenden oder herumarbeiten, indem Sie einenpip freeze | pip uninstall -r /dev/stdin
Caesar
Funktioniert nicht mit Azure-Notizbüchern: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

Andere Antworten, die else verwenden pip listoder 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

nehem
quelle
Gute Antwort ... hat bei mir
funktioniert
Dies funktionierte, bis es ein Paket traf, das diesen Fehler verursachte : 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.
SeaDude
39

Methode 1 (mit pip freeze)

pip freeze | xargs pip uninstall -y

Methode 2 (mit pip list)

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

Methode 3 (mit virtualenv)

virtualenv --clear MYENV
Suriyaa
quelle
2
sudo ist nicht erforderlich und ohne sorgfältige Überlegung wahrscheinlich gefährlich zu verwenden, da es sich auf das globale Maschinen-Setup auswirkt. sehen Sie diese Antwort zum Beispiel: stackoverflow.com/questions/15028648/...
blueberryfields
6
Methode 2 ( pip list) funktioniert hervorragend, bis Sie Pip versehentlich selbst deinstalliert haben -_-
Justin
20

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.

Prime By Design
quelle
Einfach und elegant, wirkt wie Charme
Satyaaditya
19

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
Ned Batchelder
quelle
2
Behandelt dies sogar den Fall, dass eine bearbeitbare Installation (im Grunde eine Installation im Setuptools-Entwicklungsmodus) eine lokale .egg-info-Datei erstellt hat, die dann den Rest des Installations- / Deinstallationsprozesses störte? Da es sich um eine Reihe von Dateien handelt, scheint sie nicht zu wissen, wie sie mit ihrer Anwesenheit umgehen sollen, und anstatt etwas zu deinstallieren, wird eine lokale Verzeichnisstruktur unter MYENV komplett mit: `> Neue ausführbare Python-Dateien in MYENV / bin / python3.4> Also Erstellen einer ausführbaren Datei in MYENV / bin / python> Installieren von Setuptools, Pip, Wheel ... erledigt.` Aber MYENV hat die Umgebung nicht zurückgesetzt!
mpacer
16

Unter Windows können Sie pathbei 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: uninsist 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.

Richard Kenneth Niescior
quelle
14

Verwenden der virtualenvwrapper- Funktion:

wipeenv

Siehe wipeenv-Dokumentation

zesk
quelle
6
Wenn Sie virtualenvwrapper verwenden, geben Siewipeenv
raratiru
@raratiru, großartig, jetzt fragen sich meine Kollegen wahrscheinlich, warum ich gerade Kaffee über meine Tastatur gespuckt habe
Brian Joseph
@ BrianJoseph Verdammt! Ich bin vom Stuhl gefallen ... danke!
Raratiru
14

Fügen Sie zunächst alle Pakete hinzu requirements.txt

pip freeze > requirements.txt

Dann entfernen Sie alle

pip uninstall -y -r requirements.txt 
Shafik
quelle
9

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

Craicerjack
quelle
8

Für Windows-Benutzer ist dies das, was ich unter Windows PowerShell verwende

 pip uninstall -y (pip freeze)
benwrk
quelle
6

(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 -rwenn 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.

Thibaut Dubernet
quelle
6
pip3 freeze --local | xargs pip3 uninstall -y

Der Fall könnte sein, dass man diesen Befehl mehrmals ausführen muss, um einen leeren zu erhalten pip3 freeze --local.

obotezat
quelle
3

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))
Anonym 138
quelle
2

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.
Samuel Marks
quelle
2

Dies ist der Befehl, der für mich funktioniert:

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

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

Mahdi Hamzeh
quelle
1

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 pythonin einer aktivierten virtuellen Umgebung ausführen , um den Pfad abzurufen

Punkrockpolly
quelle
1

In meinem Fall hatte ich versehentlich eine Reihe von Paketen weltweit mit einem pipunter 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
Radon Rosborough
quelle
Diese Antwort setzt zu viel über die Umgebung voraus und löst das Problem nicht direkt, wenn Sie beispielsweise pyenv verwenden.
Mark
@Mark Nun sicher, wenn Sie pyenv verwenden, müssten Sie etwas anderes tun. In dem allgemeinen Fall, dass Sie es nicht sind, glaube ich, dass dies die einfachste und am wenigsten hackige Lösung ist. Beachten Sie, dass diese Bedingung am Anfang der Antwort ausdrücklich angegeben wird.
Radon Rosborough
Das OP fragte nach virtuellen Envs. Er erwähnte nicht ausdrücklich die Verwendung eines Mac oder Brew zur Installation von Python. Daher können Sie nicht davon ausgehen, dass das Betriebssystem oder das Gebräu verwendet wurde - und diese Antwort löst nicht ALLE Bedingungen. Wenn Sie sich darauf konzentrieren, mit einem Tool wie pip nach Lösungen für die Umgebung zu suchen, werden Sie den Kontext der Umgebung ansprechen, in der Sie sich befinden. Hoffe das macht Sinn.
Mark
1
@ Mark Ich verstehe deine Position. Wir können zustimmen, nicht zuzustimmen. Ich möchte nur den Leuten von Google helfen, die auf einen Link mit der Bezeichnung "Was ist der einfachste Weg, um alle von pip installierten Pakete zu entfernen?" Klicken. wenn sie wirklich alle Pakete entfernen möchten, die global von pip installiert wurden.
Radon Rosborough
In Übereinstimmung mit @RadonRosborough ist der Link-Titel repräsentativ dafür, warum ich hier gelandet bin, auch wenn das OP nicht die gleiche Frage stellt.
Kenn Sebesta
1

In der Befehlsshell von Windows pip freeze | xargs pip uninstall -yfunktioniert der Befehl nicht. Für diejenigen unter Ihnen, die Windows verwenden, habe ich einen alternativen Weg gefunden, dies zu tun.

  1. Kopieren Sie alle Namen der installierten Pip- Pakete aus dem pip freezeBefehl in eine TXT- Datei.
  2. Gehen Sie dann zum Speicherort Ihrer TXT- Datei und führen Sie den Befehl auspip uninstall -r *textfile.txt*
Sushant Chaudhary
quelle
1

Ich verwende die Option --user, um alle auf der Benutzerseite installierten Pakete zu deinstallieren.

pip3 freeze --user | xargs pip3 deinstallieren -y

Dean
quelle
Ich glaube, diese Antwort fügt nicht viele neue Informationen hinzu. Ich hätte lieber eine Verbesserung einer anderen bereits vorhandenen ähnlichen Antwort vorgeschlagen, wie dieser: stackoverflow.com/a/45475070/11138259
sinoroc
-1

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.

Glenda
quelle
Bei allem Respekt scheint dies vergleichbar. Warum nicht dpkg-query -S '/usr/lib/python2.7/*'die Namen und dpkg-query -Ljeden 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 -llistet 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!
John P