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?
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?
Odpowiedzi:
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
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 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.txt
plik i Twoje środowisko się rozdzieliło, po prostu zastąp requirements.txt
powyższe przykłady słowem toberemoved.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).
pip uninstall -y -r <(pip freeze)
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.
virtualenv --clear MYENV
Ale zwykle po prostu usuwam i odtwarzam virtualenv, ponieważ reguły niezmienności!
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ście pip install -e
kompilacji programistycznej, próba użycia virtualenv --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 .
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?
Dla wygody dodaję to do mojego profilu bash:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Następnie uruchomić:
pipuninstallall
Jeśli używasz pipenv , możesz po prostu uruchomić:
pipenv uninstall --all
pip freeze
powoduje brak wyjścia, jeśli żaden pakiet nie jest zainstalowany, a następnie pip 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
lub 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
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.
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
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
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.
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
W systemie Windows, jeśli Twoja path
konfiguracja 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: 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.
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
(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.
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))
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.
ł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
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 python
z aktywowanej wirtualnej env, aby uzyskać ścieżkę
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:
$ brew reinstall python
Lub jeśli używasz pip3
:
$ brew reinstall python3
W powłoce poleceń systemu Windows polecenie
pip freeze | xargs pip uninstall -y
nie będzie działać. Dla tych z was, którzy korzystają z systemu Windows, wymyśliłem alternatywny sposób, aby to zrobić.
pip freeze
polecenia do pliku .txt .pip uninstall -r *textfile.txt*
Jeśli używasz pew
, możesz użyć polecenia wipeenv :
pew wipeenv [env]
Korzystam z opcji --user, aby odinstalować wszystkie pakiety zainstalowane w witrynie użytkownika.
pip3 freeze --user | xargs pip3 odinstaluj -y
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.
dpkg-query -S '/usr/lib/python2.7/*'
wyodrębnić nazw i dpkg-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 nawet pip install --target=...
. Usunięcie wszystkich aktualnie pustych katalogów również cię ugryzie!