Jak zaktualizować wszystkie pakiety Pythona za pomocą pip?


2048

Czy można zaktualizować wszystkie pakiety Pythona jednocześnie pip?

Uwaga : istnieje prośba o tę funkcję w oficjalnym narzędziu do śledzenia problemów.


37
Uważaj na zgniliznę oprogramowania - aktualizacja zależności może uszkodzić twoją aplikację. Możesz wyświetlić dokładną wersję wszystkich zainstalowanych pakietów za pomocą pip freeze(jak bundle installlub npm shrinkwrap). Najlepiej zapisać kopię tego przed majstrowaniem.
— Pułkownik Panic

Uważaj, robiąc to, psujesz pipinstalację podczas aktualizacji requests. Komunikat o błędzie to cannot import name IncompleteRead.
— Paul Rooney,

11
Wypróbowałem kilka odpowiedzi, a nowsza (a zatem odpowiedź o niskiej punktacji) daje znacznie lepszą wydajność: stackoverflow.com/questions/2720014/…
— FauChristian

Prośba o aktualne funkcje i dyskusja: github.com/pypa/pip/issues/4551
— cledoux

To pytanie jest zarówno tak stare, jak i przydatne, chcę tylko powiadomić każdego, kto tu teraz przyjdzie, że istnieje teraz nowy oficjalny najlepszy sposób na wykonanie tego wszystkiego: pipenv. Dokumenty są tutaj: docs.pipenv.org/basics, a autor Pycon 2018 mówi o tym tutaj: youtube.com/watch?v=GBQAKldqgZs . Miłego kodowania!
— Malik A. Rumi

Odpowiedzi:


2257

Nie ma jeszcze wbudowanej flagi, ale możesz jej użyć

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

Uwaga: istnieją nieskończone potencjalne warianty. Staram się, aby ta odpowiedź była krótka i prosta, ale proszę sugerować zmiany w komentarzach!

W starszej wersji pipmożesz zamiast tego użyć tego:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

grepJest pominąć edytowalne ( „-e”) definicji pakietu, jak sugeruje @jawache. (Tak, można zastąpić grep+ cutz sedlub awklub perllub ...).

-n1Flaga dla xargszapobiega przystankach jeśli wszystko zawiedzie aktualizowania jeden pakiet (dzięki @andsens ).


58
Racja :( Problem występuje teraz na github.com/pypa/pip/issues/59 . Ale na każdą sugestię wydaje się odpowiadać „Tak, ale jestem zbyt pewien, czy X jest właściwym sposobem na zrobienie Y” ... Teraz jest lepiej niż nigdy? Praktyczność pokonuje czystość? :(
— rbp

20
Drukuje również te pakiety, które zostały zainstalowane przy użyciu zwykłego menedżera pakietów (takiego jak apt-get lub Synaptic). Jeśli pip install -Uto zrobię, zaktualizuje wszystkie pakiety. Obawiam się, że może to spowodować konflikt z apt-get.
— Jabba,

8
Co powiesz na zmianę grep na: egrep -v '^ (\ - e | #)' (ten wiersz pojawia się podczas uruchamiania go na Ubuntu 12.10: „## FIXME: nie można znaleźć adresu URL svn w linkach_zależności dla tego pakietu:”.
— LasseValentini,

32
Chciałbym dorzucić teeprzed wykonaniem rzeczywistego uaktualnienia, dzięki czemu można uzyskać listę oryginalnych verisons. Np. pip freeze --local | tee before_upgrade.txt | ...W ten sposób łatwiej byłoby cofnąć, jeśli wystąpią jakiekolwiek problemy.
— Emil H

10
Dodałem, -Haby sudouniknąć irytującego komunikatu o błędzie: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
— Mario S

683

Możesz użyć następującego kodu Python. W przeciwieństwie do pip freezetego nie będzie drukować ostrzeżeń i błędów FIXME. Dla pip <10.0.1

import pip
from subprocess import call

packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)

Dla pip> = 10.0.1

import pkg_resources
from subprocess import call

packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade " + ' '.join(packages), shell=True)

21
Działa to niesamowicie dobrze… Zawsze jest tak satysfakcjonujące, gdy zadanie zajmuje NAPRAWDĘ długi czas … i daje ci mnóstwo nowych rzeczy! PS: Uruchom go jako root, jeśli korzystasz z systemu OS X!
— Alex Gray

52
Czy nie ma sposobu na zainstalowanie przy użyciu pip bez wywołania podprocesu? Coś takiego import pip pip.install('packagename')?
— endolith

6
Zapakowałem to w plik fabfile.py . Dzięki!
— Josh K

5
@BenMezger: Naprawdę nie powinieneś używać pakietów systemowych w swoim virtualenv. Nie powinieneś także uruchamiać więcej niż kilku zaufanych, znanych programów jako root. Uruchom virtualenvs z pakietami --no-site (domyślnie w najnowszych wersjach).
— jeffcook2150,

3
Kciuki w górę, wybrana odpowiedź (powyżej) kończy się niepowodzeniem, jeśli nie można już znaleźć pakietu. Ten skrypt po prostu przechodzi do następnych pakietów, cudownie.
— Josh

642

Aby zaktualizować wszystkie lokalne pakiety; możesz użyć pip-review:

$ pip install pip-review
$ pip-review --local --interactive

pip-reviewjest rozwidleniem pip-tools. Zobacz pip-toolsproblem wspomniany przez @knedlsepp . pip-reviewpakiet działa, ale pip-toolspakiet już nie działa.

pip-reviewdziała w systemie Windows od wersji 0.5 .


2
@hauzer: Nie obsługuje Pythona 3. Chociaż może to być błąd
— jfs

7
@mkoistinen To dobre narzędzie, ale dopóki nie zostanie połączone w PIP, oznacza zainstalowanie czegoś dodatkowego, czego nie każdy może chcieć zrobić.
— Wernight

2
@Daniel: pip-tools już nie działa, działa pip-review (rozwidlenie pip-narzędzi).
— jfs

7
Pip-review działa dobrze (przynajmniej dla wersji Python 3.5.0)
— FredrikHedman

15
Aby zaktualizować wszystko bez trybu interaktywnego:pip-review --local --auto
— Dlamini,

333

Działa w systemie Windows. Powinien być także dobry dla innych. ($ to katalog, w którym się znajdujesz, w wierszu polecenia. np. C: / Users / Username>)

zrobić

$ pip freeze > requirements.txt

otwórz plik tekstowy, wymienić ==się >=i wykonać

$ pip install -r requirements.txt --upgrade

Jeśli masz problem z pewnym pakietem opóźniającym aktualizację (czasami numpy), po prostu przejdź do katalogu ($), skomentuj nazwę (dodaj # przed nim) i ponownie uruchom aktualizację. Możesz później cofnąć komentarz do tej sekcji. Jest to również świetne do kopiowania globalnych środowisk Pythona.


Inny sposób:

Podoba mi się również metoda recenzji pip:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

Możesz wybrać „a”, aby zaktualizować wszystkie pakiety; jeśli jedno uaktualnienie nie powiedzie się, uruchom je ponownie i będzie kontynuowane przy następnym.


29
Należy usunąć requirements.txt„s =={version}. Na przykład: python-dateutil==2.4.2aby python-dateutilna wszystkich liniach.
— youngminz

4
Odkryłem, że tak naprawdę nie uaktualniało to pakietów na macOS.
— jkooker

10
@youngminz Poleciłbym szybkie „Zamień wszystko” == ">"> = "'w twoim edytorze / ide przed uruchomieniem polecenia„ install install ... ”, aby to naprawić
— Amaury Liet

7
dla systemu Linux: $ pip freeze | cut -d '=' -f1> requirements.txtw celu usunięcia wersji
— Cavaz

1
Jeśli używana powłoka to bash, możesz ją skrócić do jednego polecenia za pomocą pip3 install -r <(pip3 freeze) --upgrade Efektywnie, <(pip3 freeze)jest anonimowym potokiem, ale będzie działał jako obiekt pliku
— Sergiy Kolodyazhnyy

128

Wersja dla Windows po konsultacji doskonałą dokumentację dla FORRoba van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i

19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Szybciej, ponieważ spróbuje jedynie zaktualizować „przestarzałe” pakiety
— Refael Ackermann

3
@RefaelAckermann Podejrzewam, że będzie to wolniejsze niż oryginalne :) Aby wiedzieć, które pakiety są nieaktualne, pip musi najpierw sprawdzić, jaka jest najnowsza wersja każdego pakietu. Robi to dokładnie tak samo jak pierwszy krok podczas aktualizacji i nie jest kontynuowany, jeśli nie jest dostępna nowsza wersja. Jednak w twojej wersji pip sprawdzi wersje dwa razy, po raz pierwszy w celu ustalenia listy przestarzałych pakietów, a drugi raz podczas aktualizacji pakietów na tej liście.
— Piotr Dobrogost

2
@RefaelAckermann Rozpinanie pip jest o rząd wielkości szybsze niż sprawdzanie wersji pakietu przez sieć, więc jest to liczba kontroli, które należy zoptymalizować, a nie liczba spin-upów. Mój wykonuje n czeków, twój wykonuje n + m czeków.
— Piotr Dobrogost

2
+1 - Jest 6.20.2019, używam Pythona 3.7.3 na Windows 10 i był to dla mnie najlepszy sposób na aktualizację wszystkich moich lokalnych pakietów.
— MacItaly

1
Trzeba pominąć dwa pierwsze linie wyjścia: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Jeśli jest uruchamiany z pliku wsadowego, użyj go %%izamiast %i. Należy również pamiętać, że łatwiej jest zaktualizować pipprzed uruchomieniem tego polecenia za pomocą python -m pip install --upgrade pip.
— Andy

125

Użyj pipupgrade !

$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes

pipupgrade pomaga uaktualnić system, lokalny lub pakiety z requirements.txtpliku! Selektywnie aktualizuje również pakiety, które nie psują zmian. pipupgrade zapewnia również aktualizację pakietów obecnych w wielu środowiskach Python. Kompatybilny z Python2.7 +, Python3.4 + i pip9 +, pip10 +, pip18 +, pip19 +.

wprowadź opis zdjęcia tutaj

UWAGA: Jestem autorem narzędzia.


1
Ta metoda ma znacznie czystszy wynik niż odpowiedź @ rbp
— Gaia

7
Fajny pomysł, ale utknąłem na Checking...zawsze, kiedy go wypróbowałem.
— CGFoX

1
Właśnie go zainstalowałem, a także utknąłem przy sprawdzaniu[0;93mChecking...[0m
— Chris

1
@nathandrake chcesz otworzyć problem na stronie problemów?
— Achilles Gasper Rasquinha

2
Wystąpił błąd w systemie Windows 10 i Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
— Qin Heyang

74

Możesz po prostu wydrukować nieaktualne pakiety

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

14
W virtualenv robię to w następujący sposób:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
— Jeremy Blanchard

W dzisiejszych czasach możesz to również zrobić za pomocą python -m pip list outdated(chociaż nie jest w formacie wymagań).
— Jacktose

74

Ta opcja wydaje mi się prostsza i czytelniejsza:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

Wyjaśnienie jest takie, że pip list --outdatedwyświetla listę wszystkich nieaktualnych pakietów w tym formacie:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

W poleceniu awk NR>2pomija pierwsze dwa rekordy (wiersze) i {print $1}wybiera pierwsze słowo każdego wiersza (zgodnie z sugestią SergioAraujo, usunąłem, tail -n +3ponieważ awkrzeczywiście mogę sobie poradzić z pomijaniem rekordów).


Jeśli jedno uaktualnienie nie powiedzie się, żadna z nich nie nastąpi.
— Boris

2
możesz uniknąć, że ogon awk 'NR>2 {print $1}'oczyszcza dla ciebie wyjście
— SergioAraujo

@SergioAraujo, dzięki temu rozwiązanie wygląda również na czystsze, dzięki za wskazówkę!
— Marc

67

Pomocna może okazać się następująca linijka:

(pip> 20,0)

pip list --format freeze --outdated | sed 's/=.*//g' | xargs -n1 pip install -U

Starsza wersja:

pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 kontynuuje działanie, jeśli wystąpi błąd.

Jeśli potrzebujesz większej „drobnoziarnistej” kontroli nad tym, co jest pomijane i co powoduje błąd, nie należy dodawać -n1flagi i jawnie definiować błędy do zignorowania, poprzez „potokowanie” następującej linii dla każdego oddzielnego błędu:

| sed 's/^<First characters of the error>.*//'

Oto działający przykład:

pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U

Musiałem dodać filtry dla linii zaczynających się od „Could” i „Some”, ponieważ najwyraźniej pip wysyła ostrzeżenia do standardowego wyjścia :(
— Chip Camden,

OK, to jest sprawiedliwe: możesz dodać tyle, | sed 's/^<First characters of the error>.*//'ile potrzeba. Dziękuję Ci!
— raratiru

14
Lub:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
— Jens

51

Bardziej niezawodne rozwiązanie

W przypadku pip3 użyj tego:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

W przypadku pip, po prostu usuń 3 jako takie:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

OSX Oddity

OSX, od lipca 2017 r., Jest wyposażony w bardzo starą wersję sed (kilkanaście lat). Aby uzyskać rozszerzone wyrażenia regularne, użyj -E zamiast -r w powyższym rozwiązaniu.

Rozwiązywanie problemów z popularnymi rozwiązaniami

To rozwiązanie jest dobrze zaprojektowane i przetestowane 1 , podczas gdy występują problemy nawet z najbardziej popularnymi rozwiązaniami.

  • Problemy z przenośnością spowodowane zmianą funkcji linii poleceń pip
  • Awaria xargs z powodu typowych błędów procesu potomnego pip lub pip3
  • Zatłoczone logowanie z surowego wyjścia xargs
  • Poleganie na mostku Python-OS podczas potencjalnej aktualizacji 3

Powyższe polecenie używa najprostszej i najbardziej przenośnej składni pip w połączeniu z sed i sh, aby całkowicie rozwiązać te problemy. Szczegóły operacji sed można sprawdzić za pomocą skomentowanej wersji 2 .


Detale

[1] Testowane i regularnie używane w klastrze Linux 4.8.16-200.fc24.x86_64 i testowane na pięciu innych odmianach Linux / Unix. Działa również na Cygwin64 zainstalowanym w systemie Windows 10. Konieczne jest przetestowanie na iOS.

[2] Aby dokładniej zobaczyć anatomię polecenia, jest to dokładny odpowiednik powyższego polecenia pip3 z komentarzami:

# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"

# separate the output of package upgrades with a blank line
sed="$sed/echo"

# indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# output the commands
sed="$sed/p"

# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh

[3] Uaktualnienie komponentu Python lub PIP, który jest również używany do uaktualnienia komponentu Python lub PIP, może być potencjalną przyczyną impasu lub uszkodzenia bazy danych pakietu.


1
innym sposobem na pokonanie jurajskiego BSD sedOS X jest użycie gsed(GNU sed). Aby go zdobyć,brew install gnu-sed
— Walter Tross,

@WalterTross ... Jurassic ... dobre przymiotnik. Mamy teraz dwa sposoby grupowania pakietów aktualizacji pip z ładną ścieżką audytu na terminalu. (1) Użyj opcji -E jak w odpowiedzi i (2) zainstaluj gsed, aby opuścić okres jurajski.
— Douglas Daseeco

41

To wydaje się bardziej zwięzłe.

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

Wyjaśnienie:

pip list --outdated dostaje takie linie

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

W cut -d ' ' -f1, -d ' 'zestawy „przestrzeń” jako separatora,-f1 środki, aby uzyskać pierwszą kolumnę.

Tak więc powyższe linie stają się:

urllib3
wheel

następnie przekaż je, aby xargsuruchomić polecenie pip install -U, z każdą linią jako argumentami

-n1ogranicza liczbę argumentów przekazywanych do każdego polecenia pip install -Udo 1


Otrzymałem to ostrzeżenieDEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
— Reman

2
@Reman: to dlatego, że używasz Pip v9.0.1. To tylko komunikat o wycofaniu, co oznacza, że ​​niektóre funkcje nie przetrwają w przyszłej wersji Pip. Nie ma się czym martwić;)
— AlessioX,

Należy to jednak oznaczyć jako ostateczne rozwiązanie. Rzeczywiście zaakceptowana odpowiedź będzie działać na wszystkich pakietach pip, co jest stratą czasu, jeśli musisz zaktualizować tylko 1 lub 2 pakiety. To rozwiązanie, jak zamiast tego, będzie działać na wszystkich przestarzałych pakietach
— AlessioX

34

Miałem ten sam problem z aktualizacją. Rzecz w tym, że nigdy nie aktualizuję wszystkich pakietów. Aktualizuję tylko to, czego potrzebuję, ponieważ projekt może się zepsuć.

Ponieważ nie było łatwego sposobu na aktualizację pakietu po pakiecie i aktualizację pliku wymagania.txt, napisałem ten program do aktualizacji requirements.txtpip, który również aktualizuje wersje w twoim pliku 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.


8
To właśnie domyślnie powinien zrobić pip.
— Nostalg.io

główkuje za pomocą twojego narzędzia, niektóre znaki ucieczki nie działają poprawnie na moim komputerze z systemem Windows, ale poza tym jest w porządku
— Luke

tak naprawdę nie testowałem tego w systemie Windows, ale zainstaluję maszynę wirtualną. Dzięki
— Simion Agavriloaei,

Jeśli virtualenvnie jest włączonypip-upgrade --skip-virtualenv-check
— Morse

2
Działa to również z folderem wymagań mającym wspólne, dev i prod wymagania. Po prostu świetnie!
— cispisperer


27

Jednowierszowa wersja odpowiedzi @ Ramana .

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`


4
subprocess.call ("instalacja sudo pip ... na wypadek, gdybyś potrzebował uprawnień
— Maximiliano Rios

4
@MaximilianoRios Nie sudo pip installużywaj zamiast tego wirtualnej env .
— Bengt,

22

podczas korzystania z virtualenv i jeśli chcesz po prostu zaktualizować pakiety dodane do virtualenv, możesz zrobić:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade


18

Rozwiązanie Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}

pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
— Foad

2
Być może pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}byłoby bardziej odpowiednie.
— plan mózgowy

16

użyj pakietów aktualizacji awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

aktualizacja Windows PowerShell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}


zamrażanie pip | awk -F '[=]' '{print 1 $}' | xargs pip install -U
— JohnDHH

A dla Pythona 3 ... instalacja pip3 -U $ (pip3 zamrożenie | awk -F '[=]' '{print 1 $}')
— Jimmy MG Lim

12

Możesz spróbować:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done

jest to najczystszy, najlepiej czytelny sposób na aktualizację pakietów pip w jak najkrótszym czasie. świetny.
— Mark Shust w M.academy

12

Niesamowite żółtko ułatwia to.

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

Więcej informacji na temat żółtka: https://pypi.python.org/pypi/yolk/0.4.3

Może robić wiele rzeczy, które prawdopodobnie okażą się przydatne.


3
Twoja odpowiedź została zmieniona z yolkna yolk3k, twoja pierwotna odpowiedź zdecydowanie miała problemy z python3.
— AXO,

10

Odpowiedź Ramany zadziałała najlepiej dla mnie tutaj, ale musiałem dodać kilka haczyków:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

site-packagesCheck wyklucza moje pakiety rozwojowe, ponieważ nie znajdują się w systemowym katalogu site-packages. Try-wyjątkiem po prostu pomija pakiety, które zostały usunięte z PyPI.

@endolith: Miałem też nadzieję na łatwy pip.install(dist.key, upgrade=True), ale nie wygląda na to, że pip miał być używany przez nic poza wierszem poleceń (dokumenty nie wspominają o wewnętrznym interfejsie API, a twórcy pip nie używali dokumenty).


Na Ubuntu (i innych pochodnych Debiana) pipnajwyraźniej umieszcza pakiety w /usr/local/lib/python2.7/dist-packagespodobnych wersjach. W tym przypadku możesz użyć „/ usr / local / lib /” zamiast „site-packages” if.
— drevicko

10

pip_upgrade_outdatedSpełnia swoje zadanie. Według jego dokumentów :

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

Krok 1:

pip install pip-upgrade-outdated

Krok 2:

pip_upgrade_outdated

1
Krok 1: Instalacja PIP-PIP-Uaktualnienie-nieaktualne Krok 2: PIP-Uaktualnienie-Nieaktualne ... Wykonane
— Shao.lo

9

Wysłane poprzez prośbę do ludu pip ; w międzyczasie użyj tego rozwiązania biblioteki pip, które napisałem:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted

Wersja z obsługą błędów (zgodnie z komentarzem): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
— Samuel Marks

9

Wydawało mi się, że to działa ...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

printfNastępnie użyłem spacji, aby poprawnie oddzielić nazwy pakietów.


7

To jest rozwiązanie PowerShell dla Pythona 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

A dla Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

To aktualizuje pakiety jeden po drugim. Więc

pip3 check
pip2 check

następnie należy upewnić się, że żadne zależności nie zostaną zerwane.



7

Najkrótszy i najłatwiejszy w systemie Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

@Enkouyami w Windows 7 to polecenie nie działa bez -r. -r musi wykluczać ścieżkę do pliku wymagań.
— Chockomonkey

6

Mój skrypt:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade

6

Czy to nie jest bardziej skuteczne?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o wyświetla nieaktualne pakiety;
  2. grep -v -i warningodwrócone dopasowanie włączone, warningaby uniknąć błędów podczas aktualizacji
  3. cut -f1 -d1' ' zwraca pierwsze słowo - nazwę nieaktualnego pakietu;
  4. tr "\n|\r" " "konwertuje wynik multilinii z listy cutjednowierszowej, oddzielonej spacjami;
  5. awk '{if(NR>=3)print}' pomija linie nagłówka
  6. cut -d' ' -f1 pobiera pierwszą kolumnę
  7. xargs -n1 pip install -U pobiera 1 argument z potoku po lewej stronie i przekazuje go do polecenia aktualizacji listy pakietów.

Oto mój wynik: kerberos iwlib PyYAML Could pygpgme Could Could Could ...zanotuj wszystkie „Could”. Wywodzą się one z wyników pip list -o„Nie można znaleźć żadnych plików do pobrania, które spełniają wymagania <pakiet>”
— DrStrangepork,

Czy możesz wkleić wynik pip list -o?
— Alex V

Komentarze nie formatują tego dobrze, ale oto fragment # pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
— kodu

zamiast odfiltrowanie wszystkie linie, które nie powinny być używane, chciałbym zaproponować, aby odfiltrować wiersze, gdzie istnieje taka zmiana: pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . W przeciwnym razie możesz łatwo ominąć jedną linię, której nie chcesz, i uzyskać wynik, o którym wspomniał DrStrangeprk.
— antius

Zdecydowanie polecam użycie xargszamiast tego. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UTe -r, zapewnia, że flaga pip install -Unie będzie działać, jeśli nie ma przestarzałe pakiety. -pFlag pyta użytkownika, aby potwierdzić przed wykonaniem jakiegokolwiek polecenia. Możesz dodać -n1flagę, aby wyświetlała monit przed instalacją każdego pakietu osobno.
— Sześć

6

jedna linia w PowerShell 5.1 z uprawnieniami adm, python 3.6.5 i pip ver 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

działa płynnie, jeśli na liście nie ma uszkodzonych paczek lub specjalnych kół ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.