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?


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

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


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)

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!


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

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


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

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.


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

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.



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 

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


8

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

 pip uninstall -y (pip freeze)

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.


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.


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))

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.

2

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

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

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


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


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

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*


1

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

pip3 freeze --user | xargs pip3 deinstallieren -y


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.