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?

Blueberryfields
źródło
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
Blueberryfields
źródło
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)
Harshad Kavathiya
źródło
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!

Robert Moskal
źródło
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
Taylor Edmiston
źródło
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

nehem
źródło
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
Suriyaa
źródło
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.

Prime By Design
źródło
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
Ned Batchelder
źródło
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.

Richard Kenneth Niescior
źródło
14

Korzystanie z funkcji virtualenvwrapper :

wipeenv

Zobacz dokumentację wipeenv

zesk
źródło
6
Jeśli używasz virtualenvwrapper, wpiszwipeenv
raratiru
@raratiru, świetnie, teraz moi współpracownicy prawdopodobnie zastanawiają się, dlaczego po prostu wyplułem kawę na całej klawiaturze
Brian Joseph,
@BrianJoseph Damn! Upadłem z krzesła ... dziękuję!
raratiru
14

Najpierw dodaj cały pakiet do requirements.txt

pip freeze > requirements.txt

Następnie usuń wszystko

pip uninstall -y -r requirements.txt 
shafik
źródło
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

Craicerjack
źródło
8

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

 pip uninstall -y (pip freeze)
Benwrk
źródło
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.

Thibaut Dubernet
źródło
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.

obotezat
źródło
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))
Anonimowy 138
źródło
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.
Samuel Marks
źródło
2

To polecenie działa dla mnie:

pip list | awk '{print $1}' | xargs pip uninstall -y
Fei Xie
źródło
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

Mahdi Hamzeh
źródło
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ę

punkrockpolly
źródło
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
Radon Rosborough
źródło
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*
Sushant Chaudhary
źródło
1

Jeśli używasz pew, możesz użyć polecenia wipeenv :

pew wipeenv [env]

Mohammad Banisaeid
źródło
1

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

pip3 freeze --user | xargs pip3 odinstaluj -y

Dziekan
źródło
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.

glenda
źródło
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