Zaktualizuj pakiety Pythona z Requirements.txt za pomocą polecenia pip

113

Jak zaktualizować wszystkie moje pakiety Pythona z pliku Requirements.txt za pomocą polecenia pip?

próbował z poniższym poleceniem

$ pip install --upgrade -r requirements.txt

Ponieważ pakiety Pythona mają przyrostek z numerem wersji ( Django==1.5.1), nie wydają się aktualizować. Czy jest lepsze podejście niż ręczna edycja pliku Require.txt?

EDYTOWAĆ

Jak wspomniał Andy w swojej odpowiedzi, pakiety są przypięte do konkretnej wersji, stąd nie jest możliwe uaktualnienie pakietów za pomocą polecenia pip.

Ale możemy to osiągnąć za pip-toolspomocą następującego polecenia.

$ pip-review --auto

spowoduje to automatyczną aktualizację wszystkich pakietów z Requirements.txt (pamiętaj, aby zainstalować pip-toolsza pomocą polecenia pip install).

abhiomkar
źródło
7
Pip-tools działa świetnie - zaktualizowana składnia to pip-compile -U requirements.txt.
erikreed

Odpowiedzi:

41

Nie. Twój plik wymagań został przypięty do określonych wersji. Jeśli Twoje wymagania są ustawione na tę wersję, nie powinieneś próbować aktualizować poza te wersje. Jeśli potrzebujesz aktualizacji, musisz przełączyć się na nieprzypięte wersje w pliku wymagań.

Przykład:

lxml>=2.2.0

Spowoduje to uaktualnienie lxml do dowolnej wersji nowszej niż 2.2.0

lxml>=2.2.0,<2.3.0

Spowoduje to uaktualnienie lxml do najnowszej wersji między 2.2.0 a 2.3.0.

Andy
źródło
2
Pomogło mi wykonanie następujących czynności. 1. Usunięto venv 2. Utworzono nowy o tej samej nazwie (sposób na wyczyszczenie wszystkich pakietów pip) 3. Zamień all == na> = w
pliku Requirements.txt
sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt zastąpi wszystko ==z>=
philshem
80

możesz spróbować:

pip install --upgrade --force-reinstall -r requirements.txt

Możesz także zignorować zainstalowany pakiet i zainstalować nowy:

pip install --ignore-installed -r requirements.txt
Wolny strzelec
źródło
2
przy tej opcji wydaje się, że ponownie instaluje tę samą wersję. Jak Andy wspomniał w powyższej odpowiedzi, pakiety są przypinane do określonej wersji.
abhiomkar
@abhiomkar, masz rację. Myślałem, że chcesz ponownie zainstalować tę samą wersję (być może w celu dodania poprawki backport)
Freelancer
1
Drugie polecenie jest tym, czego szukałem. Zauważ, że flagi -Ii --ignore-installedsą tymi samymi flagami i oczywiście nie można mieć ,tam znaku. W ten sposób podczas instalacji nie nastąpi obniżenie wersji, a po zakończeniu instalacji wymagań można zaktualizować zainstalowane pakiety za pomocą pip-review --auto.
AXO,
79

Odpowiedziałem już na to pytanie tutaj . Oto moje rozwiązanie:

Ponieważ nie było łatwego sposobu na aktualizację pakietu po pakiecie i aktualizację pliku Requirements.txt , napisałem ten pip-upgrader, który również aktualizuje wersje w twoim requirements.txtpliku dla wybranych pakietów (lub wszystkich pakietów).

Instalacja

pip install pip-upgrader

Stosowanie

Aktywuj virtualenv (ważne, ponieważ zainstaluje również nowe wersje zaktualizowanych pakietów w bieżącym virtualenv).

cd do katalogu projektu, a następnie uruchom:

pip-upgrade

Zaawansowane użycie

Jeśli wymagania są umieszczone w niestandardowej lokalizacji, prześlij je jako argumenty:

pip-upgrade path/to/requirements.txt

Jeśli wiesz już, jaki pakiet chcesz zaktualizować, po prostu wyślij je jako argumenty:

pip-upgrade -p django -p celery -p dateutil

Jeśli chcesz zaktualizować do wersji przedpremierowej / popremierowej, dodaj --prereleaseargument do polecenia.

Pełne ujawnienie: napisałem ten pakiet.

Simion Agavriloaei
źródło
5
Wspaniały! Zaskakujące jest to, że taka funkcja nie jest obecna bezpośrednio w pip
Jacopofar
5
Elegancki! Bardzo się cieszę, że przewinąłem w dół do tego: P
PulseJet
3
Właśnie tego użyłem i to jest najlepsza rzecz od czasów f-stringów.
Pierre Sassoulas,
1
Świetne narzędzie. Dziękuję Ci.
mszaro
Bardzo przydatne narzędzie! Znalazłem też inny pakiet o nazwie pur, który aktualizuje również przypięte wersje
Gal Avineri.
4

Proponuję zamrozić wszystkie twoje zależności, aby mieć przewidywalne kompilacje .

Robiąc to, możesz zaktualizować wszystkie zależności naraz w następujący sposób:

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

Po wykonaniu powyższych przetestować swój projekt z nowym zestawem pakietów i ostatecznie popełnić ten requirements.txtplik do repozytorium.

Hermes
źródło
3

Po prostu musiałem zrobić to samo ... użyłem tego małego, jednowierszowego, aby wykonać zadanie:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

który:

  • packages=$(cat requirements.txt | sed 's/==.*//g') tworzy listę aktualnych nazw pakietów w plikach Requirements.txt (usuwa wersję).
  • echo $packages | xargs pip3 install -U następnie przekazuje wszystkie pakiety jako argumenty do pip3 w celu aktualizacji.
  • freeze=$(pip3 freeze); Pobiera wszystkie bieżące wersje pakietów w formacie wymaganym dla Requirements.txt
  • for p in $(echo $packages) następnie dokonuje iteracji po nazwach pakietów
    • echo $freeze | grep -E "^${p}==" >> requirements.new pobiera wiersz wersji pakietu z danych wyjściowych pip freeze, który pasuje do pakietu i zapisuje w nowym pliku Requirements.txt

Ma to dodatkową zaletę w postaci zachowania kolejności w oryginalnym pliku Requirements.txt. :)

Mam nadzieję że to pomoże!

MatthewJohn
źródło
2

Ponieważ nie mogłem tego zrobić za pomocą basha, napisałem moduł Pythona, aby utworzyć nowy plik wymagań bez wersji i użyć go:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

Następnie zainstaluj biblioteki z nowego pliku pip install -U -r requirements-prod-no-version.pip

Na koniec zamroź wersje do oryginalnego pliku pip freeze > requirements-prod.pip

Montaro
źródło
2

Innym rozwiązaniem jest użycie pakietu aktualizacji wymagań

pip install upgrade-requirements

A potem biegnij:

upgrade-requirements

Zaktualizuje wszystkie pakiety, które nie są w najnowszych wersjach, a na końcu utworzy zaktualizowany plik Requirements.txt.

dmdip
źródło
0
  • 1) Aby zaktualizować zainstalowane pliki pip z reqs.txt, dodaj > = w miejsce == spowoduje to, że pip zainstaluje bibliotekę większą lub równą żądanej wersji, tutaj instalując najnowszą wersję żądanej biblioteki

    1.a) ** Moja odpowiedź na wątek ** Dodając py -m pip install -r reqs.txt do codziennego restartu ... lub czegoś podobnego, możesz zaktualizować zainstalowane biblioteki. Podsumował Andy Perfectly

    -Moim powodem wejścia w ten wątek było znalezienie informacji jak zaktualizować wirtualny pip bazowy env (zwykle 10.0.03 dla mnie ??)

w nadziei na rozwiązanie problemu, z którego udało mi się wyprowadzić jedno z dwóch rozwiązań

A. tworzenie wenv || B. Instalacja wymaganych bibliotek

Dzięki Andy'emu zaspokoiłem potrzebę B.

Dodając pip > = żądaną wersję w reqs.txt

po utworzeniu nowego środowiska wirtualnego || ponowna instancja poprzedniego Venv

  1. py -m venv devenv

aby skonfigurować nowe środowisko deweloperskie

  1. reevenv\scripts\activate.bat

aktywować dev env

  1. python -m pip install -r requirenments.txt

aby zainstalować biblioteki podstawowe

wyjście yeilds

Zbieranie pip > = 20.0.2 (z -r requirenments.txt (wiersz 1)) Korzystanie z pamięci podręcznej> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip.-20.03-py none-any.whl

Znaleziono istniejącą instalację: pip 10.0.1

Odinstalowywanie pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Przepraszamy za wysypisko mózgu, mam nadzieję, że to komuś pomoże :)

🤳 Austin 👨‍🎤🚀🥊

Austin Atherton
źródło
0

Druga odpowiedź jest najbardziej użyteczna, ale chciałem zablokować niektóre pakiety, a inne mieć w najnowszej wersji (np. Youtube-dl).

Przykład requirements.txtmógłby wyglądać następująco (~ oznacza zgodność):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Następnie w terminalu użyj polecenia pip install --upgrade -r requirements.txt

Gwarantuje to, że Pillow pozostanie na 6.2.2, żądania zostaną zaktualizowane do najnowszej wersji 2.22.x (jeśli jest dostępna), a najnowsza wersja youtube-dl zostanie zainstalowana, jeśli nie została jeszcze zainstalowana.

Eli
źródło
0

Myślę, że najprostszym rozwiązaniem jest utworzenie pliku Requirements.txt z:

pip freeze | sed 's/==/>=/' > requirements.txt
Gumwon Hong
źródło
-1

Jeśli instalujesz cokolwiek w swoim projekcie django i po instalacji chcesz zaktualizować plik wymagań, to polecenie może zaktualizować plik wymaganie.txt pip freeze> Requirements.txt

jeśli twój plik wymagań nie istnieje w twoim projekcie, możesz użyć tego polecenia do tworzenia nowego pliku Require.txt pip freeze> Requirements.txt

Gaurav Mandhotra
źródło
jest to zły pomysł, ponieważ doda również wymagania wszystkich wymagań, co spowoduje niepotrzebnie duży plik wymagań. Jeśli następnie zdecydujesz się zaktualizować pojedynczą zależność, prawdopodobnie wystąpią konflikty wersji, chyba że wiesz, jakie inne wymagania zostały dodane do pliku wymagań z powodu tego pakietu.
zamieszki
-10

Edytuję wymagania.txt jak poniżej i uruchamiam $ sh ./requirements.txt

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;
Santhosh Yedidi
źródło
3
To jest idealny przykład anty-wzoru. Co jest nie tak: 1) Requirements.txt to plik .txt, ale wykonałeś go jako wykonywalny 2). Istnieje proste polecenie pip install -r Requirements.txt. Możesz więc użyć pliku Requirements.txt tylko do wyświetlenia zależności Twojego projektu. 3) Nie używasz wersji pakietów. 4) Nie jest to powszechny wzorzec, inni programiści nie robią nic o tym, jak go używać. 5) Trudne w użyciu z potokami CI / CD. Proszę nie używać tego przykładu
Fannigurt