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?
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 .
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
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).
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!
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ć:
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 freezemuszą zawierać--local inaczej, odinstalują również pakiety znajdujące się we wspólnych przestrzeniach nazw.
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
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.
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ć:
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
(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:
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.
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))
#!/usr/bin/env pythonfrom sys import stderr
from pip.commands.uninstall importUninstallCommandfrom pip import get_installed_distributions
pip_uninstall =UninstallCommand()
options, args = pip_uninstall.parse_args([
package.project_name
for package in
get_installed_distributions()ifnot package.location.endswith('dist-packages')])
options.yes =True# Don't confirm before uninstall# set `options.require_venv` to True for virtualenv restrictiontry:print pip_uninstall.run(options, args)exceptOSErroras 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.
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:
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ć.
Skopiuj wszystkie nazwy zainstalowanych pakietów pip z pip freezepolecenia do pliku .txt .
Następnie przejdź do lokalizacji pliku .txt i uruchom poleceniepip uninstall -r *textfile.txt*
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;doif! 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;doif! 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!
Odpowiedzi:
Ten fragment kodu znalazłem jako alternatywne rozwiązanie. Jest to bardziej płynne usuwanie bibliotek niż przerabianie virtualenv:
Jeśli masz pakiety zainstalowane przez VCS, musisz wykluczyć te wiersze i usunąć pakiety ręcznie (podniesione z poniższych komentarzy):
źródło
postactivate
co pozostanie.setuptools
pakiet. Rozwiązałem problem, wykonując następujące instrukcje tutaj: stackoverflow.com/questions/7446187/…pip freeze --exclude-editable | xargs pip uninstall -y
do zignorowania pakietów VCS bez użycia wzoru grepDział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).
Teraz, aby usunąć jeden po drugim
Jeśli chcemy usunąć wszystko naraz
Jeśli pracujesz nad istniejącym projektem, który ma
requirements.txt
plik i Twoje środowisko się rozdzieliło, po prostu zastąprequirements.txt
powyższe przykłady słowemtoberemoved.txt
. Następnie, po wykonaniu powyższych kroków, możesz użyćrequirements.txt
do zaktualizowania teraz czystego środowiska.I dla pojedynczego polecenia bez tworzenia żadnego pliku (jak sugerowane @joeb).
źródło
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
do zrobienia wszystkiego za jednym razem.Działa to z najnowszymi. Myślę, że to najkrótszy i najbardziej deklaratywny sposób na zrobienie tego.
Ale zwykle po prostu usuwam i odtwarzam virtualenv, ponieważ reguły niezmienności!
źródło
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…wipeenv
gdy w środowisku zgłasza błąd i niczego nie usuwa, jeśli jest używany w kontekściepip install -e
kompilacji programistycznej, próba użyciavirtualenv --clear MYENV
nie 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/ ...wipeenv
jest aliasem dostarczanym przez virtualenvwrapper, więc nie wszyscy go mają.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 .
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:
Następnie uruchomić:
Alternatywa dla pipenv
Jeśli używasz pipenv , możesz po prostu uruchomić:
źródło
pip freeze
powoduje brak wyjścia, jeśli żaden pakiet nie jest zainstalowany, a następniepip uninstall
niestety narzeka).<(...)
to bashism. Możesz więc użyć albo bash -c „...”, albo obejść się, wykonującpip 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.
Inne odpowiedzi, które wykorzystują
pip list
lubpip freeze
muszą zawierać--local
inaczej, odinstalują również pakiety znajdujące się we wspólnych przestrzeniach nazw.Oto fragment, którego regularnie używam
Ref:
pip freeze --help
źródło
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.Metoda 1 (z
pip freeze
)Metoda 2 (z
pip list
)Metoda 3 (z
virtualenv
)źródło
pip list
) działa świetnie, dopóki pip nie zostanie przypadkowo odinstalowany. -_-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
następnie odinstaluj wszystkie pakiety z 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.
źródło
Najszybszym sposobem jest całkowite przerobienie virtualenv. Zakładam, że masz plik wymagania.txt, który pasuje do produkcji, jeśli nie:
źródło
W systemie Windows, jeśli Twoja
path
konfiguracja jest prawidłowa, możesz użyć:Podobnie powinno być w przypadku systemów uniksopodobnych:
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:
unins
to 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.
źródło
Korzystanie z funkcji virtualenvwrapper :
Zobacz dokumentację wipeenv
źródło
wipeenv
Najpierw dodaj cały pakiet do
requirements.txt
Następnie usuń wszystko
źródło
To stare pytanie, które znam, ale natknąłem się na nie, więc w przyszłości możesz to zrobić:
z wersji dokumentacji pip 8.1
źródło
W przypadku użytkowników systemu Windows używam tego w programie Windows PowerShell
źródło
(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 GNUxargs
:z
man xargs
:źródło
Może się zdarzyć, że trzeba uruchomić to polecenie kilka razy, aby uzyskać pusty
pip3 freeze --local
.źródło
To był dla mnie najprostszy sposób na odinstalowanie wszystkich pakietów Pythona.
źródło
Obsługa wielu platform przy użyciu tylko
pip
:źródło
To polecenie działa dla mnie:
źródło
łatwym i solidnym sposobem międzyplatformowym i pracą w pipenv jest:
przez pipenv:
ale nie aktualizuje piplock ani pipipile, więc bądź świadomy
źródło
Jeśli biegasz
virtualenv
:na przykład, jeśli twoja wirtualna jest
/Users/you/.virtualenvs/projectx
, uruchomisz:jeśli nie wiesz, gdzie znajduje się Twoja wirtualna env, możesz uruchomić
which python
z aktywowanej wirtualnej env, aby uzyskać ścieżkęźródło
W moim przypadku przypadkowo zainstalowałem wiele pakietów na całym świecie, używając Homebrew zainstalowanego
pip
na macOS. Najłatwiejszym sposobem powrotu do domyślnych pakietów był prosty:Lub jeśli używasz
pip3
:źródło
pip freeze
polecenia do pliku .txt .pip uninstall -r *textfile.txt*
źródło
Jeśli używasz
pew
, możesz użyć polecenia wipeenv :pew wipeenv [env]
źródło
Korzystam z opcji --user, aby odinstalować wszystkie pakiety zainstalowane w witrynie użytkownika.
źródło
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):
dla dystrybucji opartej na debie:
następnie, aby wyczyścić puste katalogi pozostałe:
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.
źródło
dpkg-query -S '/usr/lib/python2.7/*'
wyodrębnić nazw idpkg-query -L
każ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 -l
wyświetla pakiety zainstalowane lokalnie, a niektóre nawetpip install --target=...
. Usunięcie wszystkich aktualnie pustych katalogów również cię ugryzie!