Jaki jest najprostszy sposób na usunięcie wszystkich pakietów zainstalowanych przez pip?


613

Próbuję naprawić jedną z moich wirtualnych wersji - chciałbym zresetować wszystkie zainstalowane biblioteki z powrotem do tych, które pasują do produkcji.

Czy jest szybki i łatwy sposób to zrobić za pomocą pipa?


10
Deinstalacja Pythona @patelshahrukh NIE usuwa pakietów pip. proszę UNIKAJ tego, ponieważ najprawdopodobniej NIE DZIAŁA tak, jak myślisz, i , w zależności od tego, jak ponownie zainstalujesz Pythona, może pozostawić maszynę w niestabilnym stanie, który wymaga więcej pracy .
blueberryfields,

może to pomóc pakietom zainstalowanym w trybie programowania lub trybie edycji: stackoverflow.com/questions/17346619/...
Charlie Parker

Odpowiedzi:


922

Ten fragment kodu znalazłem jako alternatywne rozwiązanie. Jest to bardziej płynne usuwanie bibliotek niż przerabianie virtualenv:

pip freeze | xargs pip uninstall -y

Jeśli masz pakiety zainstalowane przez VCS, musisz wykluczyć te wiersze i usunąć pakiety ręcznie (podniesione z poniższych komentarzy):

pip freeze | grep -v "^-e" | xargs pip uninstall -y

4
Uważam to za dobre rozwiązanie tylko dlatego, że nie usuwa całkowicie środowiska wirtualnego - mogłem dokonać zmian np. W tym, postactivateco pozostanie.
niceguydave

5
Po uruchomieniu tego zdałem sobie sprawę, że usunął setuptoolspakiet. Rozwiązałem problem, wykonując następujące instrukcje tutaj: stackoverflow.com/questions/7446187/…
Dan.

1
@ gerty3000 tak, spowoduje to (zgodnie z pytaniem) usunięcie wszystkich pakietów zainstalowanych w środowisku wirtualnym. w twoim środowisku, może lepiej byłoby zainstalować setuptools w globalnej lokalizacji?
blueberryfields

7
Możesz także użyć pip freeze --exclude-editable | xargs pip uninstall -ydo zignorowania pakietów VCS bez użycia wzoru grep
Connor Brinton

2
Aby odinstalować edytowalne pakiety, zobacz stackoverflow.com/questions/17346619
Dan Oak

317

Działa to dla wszystkich systemów Mac, Windows i Linux. Aby uzyskać listę wszystkich pakietów pip w pliku wymagania.txt (Uwaga: spowoduje to nadpisanie wymagań.txt, jeśli istnieje, spowoduje utworzenie nowego, także jeśli nie chcesz zastępować starych wymagań.txt, a następnie podaj inną nazwę pliku we wszystkich następujących poleceniach w miejscu wymagania.txt).

pip freeze > requirements.txt

Teraz, aby usunąć jeden po drugim

pip uninstall -r requirements.txt

Jeśli chcemy usunąć wszystko naraz

pip uninstall -r requirements.txt -y

Jeśli pracujesz nad istniejącym projektem, który ma requirements.txtplik i Twoje środowisko się rozdzieliło, po prostu zastąp requirements.txtpowyższe przykłady słowem toberemoved.txt. Następnie, po wykonaniu powyższych kroków, możesz użyć requirements.txtdo zaktualizowania teraz czystego środowiska.

I dla pojedynczego polecenia bez tworzenia żadnego pliku (jak sugerowane @joeb).

pip uninstall -y -r <(pip freeze)

11
prawdopodobnie warto wspomnieć, że wymuszasz zastąpienie ich pliku wymagań.txt, na wypadek gdyby nie wiedzieli. :)
Dave Gregory

4
Ponadto, jeśli ktoś chce usunąć wszystkie pakiety, dopisuje „-y”. Przykład:pip uninstall -r requirements.txt -y
David Metcalfe,

58
Możesz użyć pip uninstall -y -r <(pip freeze)do zrobienia wszystkiego za jednym razem.
joeb

1
@joeb tak, my też możemy to zrobić.
Harshad Kavathiya,

1
@HarshadKavathiya możesz użyć innego pliku do przechowywania zamrożenia pipa, takiego jak „current.txt”, więc wymagania.txt mogą pozostać nietknięte okrzyki
NikosKeyz

118

Działa to z najnowszymi. Myślę, że to najkrótszy i najbardziej deklaratywny sposób na zrobienie tego.

virtualenv --clear MYENV

Ale zwykle po prostu usuwam i odtwarzam virtualenv, ponieważ reguły niezmienności!


7
Czy to faktycznie to samo, co bieganie wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
Taylor Edmiston

Właściwie - wydaje się (z tego, na co właśnie wpadłem), podczas wipeenvgdy w środowisku zgłasza błąd i niczego nie usuwa, jeśli jest używany w kontekście pip install -ekompilacji programistycznej, próba użycia virtualenv --clear MYENVnie rzuca błędu i nie usuwa żadnego z pakiety, które mogłeś wcześniej zainstalować w środowisku. Tak przynajmniej jest w przypadku OSX. Więcej informacji na stronie bitbucket.org/dhellmann/virtualenvwrapper/issues/211/ ...
mpacer

2
wipeenvjest aliasem dostarczanym przez virtualenvwrapper, więc nie wszyscy go mają.
Jonathan Hartley,

2
Cóż, to jest trochę brudna sztuczka, ale działa jak magia. Wolałbym, aby wszyscy używali odinstalowania pip -r wymagania.txt -y. To sprawia, że ​​świetnie się czyści.
Muema,

84

Chciałem podnieść tę odpowiedź z sekcji komentarzy, ponieważ jest to jedno z najbardziej eleganckich rozwiązań w tym wątku. Pełne uznanie dla tej odpowiedzi należy do @joeb .

pip uninstall -y -r <(pip freeze)

Działa to świetnie dla mnie w przypadku użycia czyszczenia folderu moich pakietów użytkownika poza kontekstem virtualenv, którego wiele powyższych odpowiedzi nie obsługuje.

Edycja: Czy ktoś wie, jak uruchomić to polecenie w pliku Makefile?

Bonus: Alias ​​bash

Dla wygody dodaję to do mojego profilu bash:

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

Następnie uruchomić:

pipuninstallall

Alternatywa dla pipenv

Jeśli używasz pipenv , możesz po prostu uruchomić:

pipenv uninstall --all

8
Powinno być z łatwością # 1
Mark

Podoba mi się, ale to nie działa w przypadku zerowym ( pip freezepowoduje brak wyjścia, jeśli żaden pakiet nie jest zainstalowany, a następnie pip uninstallniestety narzeka).
Eric G

Hmm dobry chwyt. Być może może być zawinięty w funkcję bash, która sprawdza, czy wyjście zamrażania pip nie jest puste. Nie widzę świetnego sposobu na osiągnięcie tego, utrzymując polecenie w ładnej, krótkiej linijce.
Taylor Edmiston,

1
make używa domyślnie sh, ale składnia podstawienia <(...)to bashism. Możesz więc użyć albo bash -c „...”, albo obejść się, wykonującpip freeze | pip uninstall -r /dev/stdin
Caesar

Nie działa z notebookami 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

Inne odpowiedzi, które wykorzystują pip listlub pip freeze muszą zawierać--local inaczej, odinstalują również pakiety znajdujące się we wspólnych przestrzeniach nazw.

Oto fragment, którego regularnie używam

 pip freeze --local | xargs pip uninstall -y

Ref: pip freeze --help


Dobra odpowiedź ... zadziałało dla mnie
igorkf

To działało, dopóki nie uderzył pakiet odpowiedzialny za ten błąd: 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.. Wtedy nie mogłem odinstalować więcej modułów.
SeaDude

39

Metoda 1 (z pip freeze)

pip freeze | xargs pip uninstall -y

Metoda 2 (z pip list)

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

Metoda 3 (z virtualenv)

virtualenv --clear MYENV

2
sudo nie jest konieczne i prawdopodobnie jest niebezpieczne w użyciu bez starannego rozważenia, ponieważ wpływa na globalną konfigurację komputera. zobacz tę odpowiedź na przykład: stackoverflow.com/questions/15028648/...
blueberryfields

6
Metoda 2 ( pip list) działa świetnie, dopóki pip nie zostanie przypadkowo odinstalowany. -_-
Justin

20

Udało mi się to, wykonując następujące czynności:

Utwórz plik wymagań o nazwie reqs.txt z listą aktualnie zainstalowanych pakietów

pip freeze > reqs.txt

następnie odinstaluj wszystkie pakiety z reqs.txt

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

Podoba mi się ta metoda, ponieważ zawsze masz plik wymagań pip, na którym można się oprzeć w przypadku popełnienia błędu. Jest to również powtarzalne.


Prosty i elegancki, działa jak urok
Satyaaditya

19

Najszybszym sposobem jest całkowite przerobienie virtualenv. Zakładam, że masz plik wymagania.txt, który pasuje do produkcji, jeśli nie:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt

2
Czy to w ogóle obsługuje przypadek, w którym istniała instalacja do edycji (w zasadzie instalacja w trybie programowania setuptools), która utworzyła lokalny plik .egg-info, który następnie zakłócał resztę procesu instalacji / dezinstalacji? Ponieważ jest to zbiór plików, wydaje się, że nie wie, jak obsłużyć ich obecność, i zamiast odinstalować cokolwiek, uzupełnia strukturę lokalnego katalogu w MYENV o: `> Nowe pliki wykonywalne python w MYENV / bin / python3.4> Również tworzenie pliku wykonywalnego w MYENV / bin / python> Instalowanie setuptools, pip, wheel ... gotowe. Ale MYENV nie zresetował środowiska!
mpacer

16

W systemie Windows, jeśli Twoja pathkonfiguracja jest prawidłowa, możesz użyć:

pip freeze > unins && pip uninstall -y -r unins && del unins

Podobnie powinno być w przypadku systemów uniksopodobnych:

pip freeze > unins && pip uninstall -y -r unins && rm unins

Tylko ostrzeżenie, że nie jest to całkowicie solidne, ponieważ możesz napotkać problemy, takie jak „Nie znaleziono pliku”, ale może jednak działać w niektórych przypadkach

EDYCJA: Dla jasności: uninsto dowolny plik, w którym zapisane są dane, gdy polecenie to wykonuje:pip freeze > unins

Plik, który zapisał z kolei, jest następnie wykorzystywany do odinstalowania wyżej wymienionych pakietów za domyślną zgodą / uprzednią zgodą za pośrednictwem pip uninstall -y -r unins

Plik jest ostatecznie usuwany po zakończeniu.



14

Najpierw dodaj cały pakiet do requirements.txt

pip freeze > requirements.txt

Następnie usuń wszystko

pip uninstall -y -r requirements.txt 

9

To stare pytanie, które znam, ale natknąłem się na nie, więc w przyszłości możesz to zrobić:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r, - plik wymagań

Odinstaluj wszystkie pakiety wymienione w danym pliku wymagań. Z tej opcji można korzystać wiele razy.

z wersji dokumentacji pip 8.1


8

W przypadku użytkowników systemu Windows używam tego w programie Windows PowerShell

 pip uninstall -y (pip freeze)

6

(dodając to jako odpowiedź, ponieważ nie mam wystarczającej reputacji, aby skomentować odpowiedź @blueberryfields)

Odpowiedź @blueberryfields działa dobrze, ale kończy się niepowodzeniem, jeśli nie ma pakietu do odinstalowania (co może być problemem, jeśli ten „odinstaluj wszystko” jest częścią skryptu lub pliku makefile). Można to rozwiązać xargs -r, używając wersji GNU xargs:

pip freeze --exclude-editable | xargs -r pip uninstall -y

z man xargs:

-r, --no-run-if-empty

Jeśli standardowe wejście nie zawiera żadnych niepustych danych, nie uruchamiaj polecenia. Zwykle polecenie jest uruchamiane raz, nawet jeśli nie ma danych wejściowych. Ta opcja jest rozszerzeniem GNU.


6
pip3 freeze --local | xargs pip3 uninstall -y

Może się zdarzyć, że trzeba uruchomić to polecenie kilka razy, aby uzyskać pusty pip3 freeze --local.


3

To był dla mnie najprostszy sposób na odinstalowanie wszystkich pakietów Pythona.

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

Obsługa wielu platform przy użyciu tylko 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

To polecenie działa dla mnie:

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

2

łatwym i solidnym sposobem międzyplatformowym i pracą w pipenv jest:

pip freeze 
pip uninstall -r requirement

przez pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

ale nie aktualizuje piplock ani pipipile, więc bądź świadomy


1

Jeśli biegasz virtualenv:

virtualenv --clear </path/to/your/virtualenv>

na przykład, jeśli twoja wirtualna jest /Users/you/.virtualenvs/projectx, uruchomisz:

virtualenv --clear /Users/you/.virtualenvs/projectx

jeśli nie wiesz, gdzie znajduje się Twoja wirtualna env, możesz uruchomić which pythonz aktywowanej wirtualnej env, aby uzyskać ścieżkę


1

W moim przypadku przypadkowo zainstalowałem wiele pakietów na całym świecie, używając Homebrew zainstalowanego pipna macOS. Najłatwiejszym sposobem powrotu do domyślnych pakietów był prosty:

$ brew reinstall python

Lub jeśli używasz pip3:

$ brew reinstall python3

Ta odpowiedź zakłada zbyt wiele na temat środowiska i nie rozwiązuje bezpośrednio problemu, jeśli na przykład używasz pyenv.
Mark

@ Mark Dobrze, jeśli używasz pyenv, musisz zrobić coś innego. W powszechnym przypadku, w którym nie jesteś, uważam, że jest to najprostsze i najmniej hackujące rozwiązanie. Pamiętaj, że ten warunek jest wyraźnie określony na początku odpowiedzi.
Radon Rosborough,

OP zapytał o virtualenvs. Nie wspomniał konkretnie o używaniu komputera Mac lub naparu do instalacji Pythona. Dlatego nie możesz założyć, że system operacyjny lub napar został użyty - a ta odpowiedź nie rozwiąże WSZYSTKICH warunków. Jeśli skupiasz się na rozwiązywaniu problemów związanych ze środowiskiem za pomocą narzędzia takiego jak pip - zajmiesz się kontekstem środowiska, w którym się znajdujesz. Mam nadzieję, że to ma sens.
Mark

1
@ Mark Znam twoje stanowisko. Możemy zgodzić się nie zgadzać. Chcę tylko pomóc ludziom z Google, którzy klikają link z etykietą „Jaki jest najłatwiejszy sposób na usunięcie wszystkich pakietów zainstalowanych przez pip?” kiedy naprawdę chcą usunąć wszystkie pakiety zainstalowane globalnie przez pip.
Radon Rosborough,

Uzgodniony z @RadonRosborough, tytuł linku jest reprezentatywny dla tego, dlaczego tu wylądowałem, nawet jeśli OP nie zadaje tego samego pytania.
Kenn Sebesta

1

W powłoce poleceń systemu Windows polecenie pip freeze | xargs pip uninstall -ynie będzie działać. Dla tych z was, którzy korzystają z systemu Windows, wymyśliłem alternatywny sposób, aby to zrobić.

  1. Skopiuj wszystkie nazwy zainstalowanych pakietów pip z pip freezepolecenia do pliku .txt .
  2. Następnie przejdź do lokalizacji pliku .txt i uruchom poleceniepip uninstall -r *textfile.txt*


1

Korzystam z opcji --user, aby odinstalować wszystkie pakiety zainstalowane w witrynie użytkownika.

pip3 freeze --user | xargs pip3 odinstaluj -y


Wierzę, że ta odpowiedź nie dodaje wiele nowych informacji, wolałbym raczej ulepszyć inną już istniejącą podobną odpowiedź, taką jak ta: stackoverflow.com/a/45475070/11138259
sinoroc

-1

Pip nie ma możliwości dowiedzenia się, które pakiety zostały przez niego zainstalowane i jakie pakiety zostały zainstalowane przez menedżera pakietów systemu. W tym celu musisz zrobić coś takiego

dla dystrybucji opartych na rpm (zamień python2.7 na wersję Pythona, z którą zainstalowałeś pip):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

dla dystrybucji opartej na debie:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

następnie, aby wyczyścić puste katalogi pozostałe:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

Uważam, że najwyższa odpowiedź jest bardzo myląca, ponieważ usunie wszystkie (większość?) Pakiety Pythona z twojej dystrybucji i prawdopodobnie pozostawi zepsuty system.


Z całym szacunkiem wydaje się to porównywalne. Dlaczego nie dpkg-query -S '/usr/lib/python2.7/*'wyodrębnić nazw i dpkg-query -Lkażdej nazwy, aby zrzucić powiązane pliki? Ma już przygotowane manifesty. Moje główne zastrzeżenie polega na tym, że zamiast celować w pakiety instalowane gdziekolwiek poza pipem, celowałeś w pakiety instalowane przez coś innego niż menedżer, którego oczekujesz, w miejscu, w którym pip na ogół nie powinien się dotykać. pip list -lwyświetla pakiety zainstalowane lokalnie, a niektóre nawet pip install --target=.... Usunięcie wszystkich aktualnie pustych katalogów również cię ugryzie!
John P
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.