Mam plik wymagań pip, który zmienia się podczas programowania.
Można pip
go odinstalować pakiety, które nie pojawiają się w pliku wymagań, a także zainstalować te, które się pojawiają? Czy istnieje standardowa metoda?
Dzięki temu plik wymagań pip stałby się kanoniczną listą pakietów - podejście „wtedy i tylko wtedy”.
Aktualizacja : zasugerowałem to jako nową funkcję na https://github.com/pypa/pip/issues/716
Odpowiedzi:
Krótka odpowiedź brzmi: nie, nie możesz tego zrobić za pomocą pip.
źródło
pip uninstall -r requirements.txt
-y
do polecenia @Ommit, aby uniknąć konieczności naciskania Y i wielokrotnego wprowadzania. Ucz się na moich błędach.pip uninstall -r requirements.txt
odinstaluje tylko wersje z twojego Requirements.txt. Jeśliboto3==1.10.0
na przykład odinstalujesz ,pip freeze
pokaże,boto3==1.0.1
czy zainstalowałeś ją (lub jakąkolwiek starszą wersję) wcześniej.Powinno to odinstalować wszystko, czego nie ma w Requirements.txt:
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y
Chociaż nie będzie to działać poprawnie z pakietami zainstalowanymi z
-e
, np. Z repozytorium git lub podobnego. Aby je pominąć, po prostu odfiltruj pakiety zaczynające się od-e
flagi:pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y
Wtedy oczywiście:
Aktualizacja na rok 2016: Prawdopodobnie nie chcesz jednak faktycznie korzystać z powyższego podejścia. Sprawdź,
pip-tools
apip-sync
które osiągną to, co prawdopodobnie chcesz zrobić, w znacznie bardziej solidny sposób.https://github.com/nvie/pip-tools
Aktualizacja na maj 2016 r .:
Możesz teraz również użyć
pip uninstall -r requirements.txt
, jednak robi to w zasadzie odwrotnie - odinstalowuje wszystko wrequirements.txt
Aktualizacja na maj 2019:
Sprawdź pipenv . W świecie zarządzania pakietami wydarzyło się wiele, co sprawia, że tego rodzaju pytania są nieco przestarzałe. Jednak nadal całkiem szczęśliwie używam pip-tools.
źródło
project.config
pliku dla Django na Elastic Beanstalk:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
. Teraz mogę wycofać pakiety pip bez przebudowywania mojego środowiska, używając tylko komentarzy wrequirements.txt
. Oszczędza mi to prawdziwego przestoju. Dziękuję Ci!pip freeze
komentuje, ale któregoś dnia mogą dodać go do API, a jeśli to zrobią, będzie ważny. Jeśli tego nie zrobią, powyższe jest niemożliwe. Myślnik pozwala na użycie stdin z poprzedniego polecenia, w tym przypadku myślnik mówi grepowi, aby porównał zawartośćpip freeze
pip freeze
To nie jest cecha
pip
, nie. Jeśli naprawdę chcesz czegoś takiego, możesz napisać skrypt porównujący dane wyjściowepip freeze
z twoimirequirements.txt
, ale prawdopodobnie byłoby to bardziej kłopotliwe niż warte.Używając
virtualenv
, łatwiej i bardziej niezawodnie jest po prostu stworzyć czyste środowisko i (ponownie) zainstalować zrequirements.txt
, na przykład:źródło
requirements.txt
), dlaczego miałby kiedykolwiek zostać ponownie zainstalowany?Możesz teraz przekazać
-r requirements.txt
argument dopip uninstall
.Przynajmniej od
pip
8.1.2pip help uninstall
pokazuje:... Uninstall Options: -r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be used multiple times. ...
źródło
To jest stare pytanie (ale dobre) i od czasu jego zadania wiele się zmieniło.
W
pip-sync
innej odpowiedzi jest odręczne odniesienie do , ale zasługuje na własną odpowiedź, ponieważ rozwiązuje dokładnie problem PO.pip-sync pobiera
requirements.txt
plik jako dane wejściowe i „poprawia” Twoje bieżące środowisko Pythona, tak aby pasowało dokładnie do tego , co w nim jestrequirements.txt
. Obejmuje to usunięcie wszystkich pakietów, które są obecne w twoim środowisku env, ale ich nie marequirements.txt
.Przykład: Załóżmy, że chcemy, aby nasza env zawiera (tylko) 3: biblioteki
libA
,libB
ilibC
, tak jak poniżej:> cat requirements.txt libA==1.0 libB==1.1 libC==1.2
Ale nasze środowisko zawiera obecnie
libC
ilibD
:> pip freeze libC==1.2 libD==1.3
Uruchomienie pip-sync spowoduje, że był to nasz pożądany stan końcowy:
> pip-sync requirements.txt > pip freeze libA==1.0 libB==1.1 libC==1.2
źródło
Propozycja Stephena to fajny pomysł, ale niestety nie działa, jeśli umieścisz w swoim pliku tylko bezpośrednie wymagania, co dla mnie brzmi czysto.
Wszystkie zależności zostaną odinstalowane, w tym nawet
distribute
,pip
samoczynnie się zepsuje.Utrzymywanie czystego pliku wymagań podczas śledzenia wersji środowiska wirtualnego
Oto jak próbuję śledzić wersje mojego wirtualnego środowiska. Staram się zachować minimum
requirements.txt
, w tym tylko bezpośrednie wymagania, nie wspominając nawet o ograniczeniach wersji, jeśli nie jestem pewien.Ale poza tym zachowuję i dołączam do śledzenia wersji (powiedzmy git) rzeczywisty stan mojego virtualenv w
venv.pip
pliku.Oto przykładowy przepływ pracy:
skonfiguruj obszar roboczy virtualenv ze śledzeniem wersji:
zainicjalizuj system śledzenia wersji:
git init echo venv > .gitignore pip freeze > venv.pip git add .gitignore venv.pip git commit -m "Python project with venv"
zainstaluj pakiet z zależnościami, umieść go w pliku wymagań:
Teraz zacznij budować swoją aplikację, a następnie zatwierdź i rozpocznij nową gałąź:
vim myapp.py git commit -am "Simple flask application" git checkout -b "experiments"
zainstaluj dodatkowy pakiet:
... baw się nim, a potem wróć do wcześniejszej wersji
vim manage.py git commit -am "Playing with flask-script" git checkout master
Teraz odinstaluj obce pakiety:
Przypuszczam, że proces można zautomatyzować za pomocą haków git, ale nie odchodźmy od tematu.
Oczywiście sensowne jest wtedy użycie jakiegoś systemu buforowania pakietów lub lokalnego repozytorium, takiego jak pip2pi
źródło
Piggybacking off @ stephen-j-fuhry tutaj jest odpowiednikiem PowerShell, którego używam:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
źródło
Chociaż to nie odpowiada bezpośrednio na pytanie, lepszą alternatywą dla
requirements.txt
teraz jest użyciePipfile
. Działa podobnie do RubiegoGemfile
. Obecnie musisz skorzystać z tegopipenv
narzędzia, ale miejmy nadzieję, że zostanie ono ostatecznie włączone dopip
. Zapewnia topipenv clean
polecenie, które robi to, co chcesz.(Zauważ, że możesz zaimportować istniejący
requirements.txt
zpipenv install -r requirements.txt
. Po tym powinieneś mieć aPipfile
irequirements.txt
można je usunąć.)źródło
Jest to teraz możliwe za pomocą:
źródło