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.

thedjpetersen
źródło
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 ).

rbp
źródło
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)
Manishankar Singh
źródło
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 .

jfs
źródło
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.

azazelspeaks
źródło
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
Piotr Dobrogost
źródło
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.

Achilles Gasper Rasquinha
źródło
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:'
janrito
źródło
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).

Marc
źródło
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
raratiru
źródło
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.

Douglas Daseeco
źródło
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

Shihao Xu
źródło
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.

Simion Agavriloaei
źródło
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
28

Od https://github.com/cakebread/yolk :

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

jednak najpierw musisz zdobyć żółtko:

$ sudo pip install -U yolk
tkr
źródło
1
Ostatnie zatwierdzenie 7 lat temu
Boris
w roku 2013 ne
dotbit,
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()]'

`

Salman von Abbas
źródło
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
brunobord
źródło
19

Najprostszym i najszybszym rozwiązaniem, które znalazłem w dyskusji na temat pipa jest:

pip install pipdate
pipdate

Źródło: https://github.com/pypa/pip/issues/3819

RedEyed
źródło
2
Podczas gdy inne rozwiązania utknęły w martwym punkcie po najmniejszej anomalii, to rozwiązanie ostrzegło, a następnie pominęło problem, aby kontynuować z innymi pakietami. Świetny!
Serge Stroobandt,
18

Rozwiązanie Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Apeirogon Prime
źródło
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]}

JohnDHH
źródło
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
何宗翰
źródło
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.

użytkownik1175849
źródło
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).

chbrown
źródło
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
adrin
źródło
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
Samuel Marks
źródło
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.

SaxDaddy
źródło
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.

Nils Ballmann
źródło
7

Co powiesz na:

pip install -r <(pip freeze) --upgrade
użytkownik8598996
źródło
7

Najkrótszy i najłatwiejszy w systemie Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Ankireddy
źródło
@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
Lodowate
źródło
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.
Alex V.
źródło
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ół ...

Sébastien Więckowski
źródło