Jak mogę zaktualizować określone pakiety za pomocą pipa i pliku wymagań?

436

Używam pip z plikiem wymagań w virtualenv dla moich projektów Django. Próbuję zaktualizować niektóre pakiety, zwłaszcza sam Django, i pojawia się błąd dotyczący konfliktów kodu źródłowego:

Source in `<virtualenv`>/build/Django has version 1.2.3 that conflicts with Django==1.2.4 (from -r requirements/apps.txt (line 3))

To po aktualizacji numeru wersji Django z 1.2.3 do 1.2.4 w moim pliku wymagań. Korzystam z tego polecenia, aby wykonać aktualizację:

pip --install --upgrade -E `<virtualenv dir`> --requirement `<requirements file`>

Nie mogę znaleźć żadnej flagi, która wyzwalałaby ponowne pobranie całego pakietu. Próbowałem nawet uruchomić najpierw polecenie dezinstalacji, a następnie zainstalować, ale nie ma kości. Może coś mi umknęło?

gcaprio
źródło
1
Sprawdź odpowiedź @ dr-jimbob, ponieważ najnowsze wersje pipa faktycznie zaktualizują wszystkie inne zależności, od których zależy aktualizowany pakiet.
Lokesh Meher

Odpowiedzi:

61

Nie jestem pewien, czy to dokładnie twój problem, ale w moim przypadku nie byłem w stanie zaktualizować Django do wersji 1.2.4 - zawsze kończyłem z wersją 1.2.3, więc odinstalowałem Django z:

<virtualenv>/bin/pip uninstall Django

Następnie usunąłem <virtualenv>/build/Djangokatalog i ostatecznie zainstalowałem odpowiednią wersję z:

<virtualenv>/bin/pip install Django

Mam nadzieję, że to pomoże.

Marcin Świerczyński
źródło
53
To nie jest najlepsza praktyka. Użyj pip install Django -Ulub pip install Django --upgradejak opisano w odpowiedzi @JoeyG.
Ahmad
@Ahmad się zgadza. Powinien istnieć płynny proces aktualizacji w środowisku pip i wirtualnej środowisku.
Parth Joshi
1271

Uruchomiłem następujące polecenie i zaktualizowałem je z 1.2.3 do 1.4.0

pip install Django --upgrade

Skrót do aktualizacji:

pip install Django -U

Uwaga : jeśli aktualizowany pakiet ma jakieś wymagania, to polecenie dodatkowo zaktualizuje wszystkie wymagania do najnowszych dostępnych wersji. W najnowszych wersjach pipa można temu zapobiec, określając--upgrade-strategy only-if-needed . Z tą flagą zależności nie będą uaktualniane, chyba że zainstalowane wersje zależnych pakietów nie będą spełniać wymagań uaktualnionego pakietu.

JoeyG
źródło
7
To dla mnie zaktualizowało wszystkie moje spakowane i totalnie wszystko popsuło !!!! Dokumenty stwierdza: - uaktualnij wszystkie pakiety do najnowszej dostępnej wersji. Czy to prawda, czy zrobiłem coś złego?
Prometeusz
4
@OrbiterFleet Musiałem zaktualizować „żądania”, więc zrobiłem to pip install Requests --upgradei zaktualizowałem tylko „żądania”. Opis mówi „uaktualnij wszystkie określone pakiety” podczas przeglądania dokumentów.
harperville
31
UWAGA, aktualizuje również wszystkie zależności i może zepsuć wszystko. najlepszą opcją jest odinstalowanie i ponowna instalacja pakietu.
marcelosalloum
3
zaktualizować użycie konkretnego pakietupip install --upgrade django==1.4.0
whale_steward
powinna to być odpowiednia odpowiedź na pytanie, w przeciwnym razie samo pytanie jest błędne.
int soumen,
51

zgodnie z pip docs przykład 3

pip install --upgrade django

ale na podstawie mojego doświadczenia, użycie tej metody spowoduje również aktualizację każdego pakietu z nią związanego. przykład:

Załóżmy, że chcesz dokonać aktualizacji, somepackagektóra wymaga django >= 1.2.4zastosowania tego rodzaju metody, zaktualizuje somepackageORAZ djangodo najnowszej aktualizacji. Dla bezpieczeństwa wykonaj:

# assume you want to keep django 1.2.4
pip install --upgrade somepackage django==1.2.4

W ten sposób zaktualizujesz somepackagei utrzymasz django w wersji 1.2.4

whale_steward
źródło
Dobry chwyt, ale twoje wyjaśnienie jest mylące, ponieważ zacząłeś djangojako główny pakiet, a następnie w przykładzie, którego używasz, somepackagea następnie używasz djangojako zależności.
Długi
34

Skrót dla --upgrade:

pip install Django --upgrade

Jest:

pip install Django -U
Aaron Lelevier
źródło
7
Co powiesz na edycję istniejącej odpowiedzi, aby dodać ten kawałek informacji zamiast (niepełnej) odpowiedzi?
a1an
@ a1an proszę zasugerować, jakie dodatkowe informacje powinny zostać dodane w „sugerowanej edycji”. Dzięki
Aaron Lelevier
4
Mam na myśli, że możesz edytować odpowiedź udzieloną przez JoeyG, dodając opcję skrótu podaną tam w kontekście.
a1an
17

Jeśli zaktualizujesz pakiet, stary zostanie odinstalowany.

Wygodnym sposobem na to jest skorzystanie z tego narzędzia do aktualizacji pip, które aktualizuje również wersje requirements.txtpliku dla wybranych pakietów (lub wszystkich pakietów).

Instalacja

pip install pip-upgrader

Stosowanie

Aktywuj virtualenv (ważne, ponieważ zainstaluje także nowe wersje uaktualnionych 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 już wiesz, jaki pakiet chcesz zaktualizować, po prostu wyślij je jako argumenty:

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

Jeśli chcesz zaktualizować wersję do wersji wstępnej / późniejszej, dodaj --prereleaseargument do swojego polecenia.

Pełne ujawnienie: napisałem ten pakiet. Mam nadzieję, że to pomoże.

Simion Agavriloaei
źródło
1
czy istnieje opcja uaktualnienia wszystkich pakietów jednocześnie (tj. bez ich wymieniania) przy użyciu tego podejścia?
Fan Bjorks numer jeden
1
@MikePalmice tak: pip-upgrade -p allzaktualizuje wszystkie twoje pakiety i zaktualizuje plik wymagań bez potrzeby wkładania od ciebie danych.
Simion Agavriloaei
15

Jeśli chcesz uaktualnić tylko jeden konkretny pakiet o nazwie somepackage, polecenie, którego powinieneś użyć w najnowszych wersjach pip to

pip install --upgrade --upgrade-strategy only-if-needed somepackage

Jest to bardzo przydatne, gdy opracowałeś aplikację w django, która obecnie będzie działać tylko z określoną wersją django (powiedzmy Django = 1.9.x) i chcesz zaktualizować jakiś zależny pakiet z poprawką / nową funkcją, a pakiet uaktualniony zależy na django (ale działa z powiedzmy każdą wersją django po 1.5). Domyślnym działaniem pip install --upgrade django-some-packagebyłoby uaktualnienie django do najnowszej dostępnej wersji, która w innym przypadku mogłaby uszkodzić twoją aplikację, chociaż w przypadku --upgrade-strategy only-if-neededzależnych pakietów będzie teraz aktualizowana tylko w razie potrzeby.

dr jimbob
źródło
4

Zwykle pip wyczyści się po sobie i usunie zawartość katalogu kompilacji. Nie robi tego tylko wtedy, gdy:

  1. Użyłeś --no-installopcji
  2. Używasz edytowalnych pakietów
  3. Instalacja została anulowana lub została w inny sposób przerwana.

We wszystkich innych przypadkach nie powinieneś mieć buildkatalogu, który blokuje twoje środowisko.

Burhan Khalid
źródło
1

Zdefiniowanie konkretnej wersji do uaktualnienia pomogło mi zamiast tylko polecenia uaktualnienia.

pip3 install larapy-installer==0.4.01 -U
Bedram Tamang
źródło
0

które rozwiązało dla mnie problem „pip install -I - upgrade psutil --force”, po prostu odinstaluj psutil z nową wersją i mam nadzieję, że możesz nagle zainstalować starszą wersję (:

Eran Hpac
źródło
0

Używam tego:

pip3 install -r  requirements.txt  
Shahab Rahnama
źródło