Come aggiornare tutti i pacchetti Python con pip?


2052

È possibile aggiornare contemporaneamente tutti i pacchetti Python pip?

Nota : esiste una richiesta di funzionalità per questo sul tracker dei problemi ufficiale.


37
Fai attenzione al marciume del software: l' aggiornamento delle dipendenze potrebbe interrompere l'app. Puoi elencare la versione esatta di tutti i pacchetti installati con pip freeze(like bundle installo npm shrinkwrap). Meglio salvarne una copia prima di armeggiare.
— Colonnello Panic,

Fai attenzione quando fai questo, rovini l' pipinstallazione, quando aggiorni requests. Il messaggio di errore è cannot import name IncompleteRead.
— Paul Rooney,

11
Ho provato un po 'di risposte e una più recente (e quindi a bassa risposta di punteggio) produce un'uscita di gran lunga migliore: stackoverflow.com/questions/2720014/...
— FauChristian

Discussioni e richieste di funzionalità aggiornate: github.com/pypa/pip/issues/4551
— cledoux

Questa domanda è sia così vecchia che così utile, voglio solo avvisare chiunque venga qui d'ora in poi che ora c'è un nuovo modo migliore ufficiale per fare tutto questo: pipenv. I documenti sono qui: docs.pipenv.org/basics e il discorso Pycon 2018 dell'autore è qui: youtube.com/watch?v=GBQAKldqgZs . Buona programmazione!
— Malik A. Rumi,

Risposte:


2261

Non c'è ancora un flag incorporato, ma puoi usarlo

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

Nota: ci sono infinite potenziali variazioni per questo. Sto cercando di mantenere questa risposta breve e semplice, ma ti preghiamo di suggerire variazioni nei commenti!

Nella versione precedente di pip, è possibile utilizzare questo invece:

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

Il grepè di saltare modificabili ( "-e") delle definizioni di pacchetto, come suggerito da @jawache. (Sì, è possibile sostituire grep+ cutcon sedo awkoperl o ...).

Il -n1flag per xargsimpedisce di interrompere tutto se l'aggiornamento di un pacchetto fallisce (grazie a @andsens ).


59
Esatto :( Il problema ora vive su github.com/pypa/pip/issues/59 . Ma ogni suggerimento sembra avere una risposta con "Sì, ma sono troppo sicuro che X sia il modo giusto di fare Y" ... Ora è meglio che mai? La
— praticità

20
Stampa anche quei pacchetti che sono stati installati con un normale gestore di pacchetti (come apt-get o Synaptic). Se eseguo questo pip install -U, aggiornerà tutti i pacchetti. Temo che possa causare qualche conflitto con apt-get.
— Jabba,

8
Che ne dici di cambiare grep in: egrep -v '^ (\ - e | #)' (ottengo questa linea quando lo eseguo su Ubuntu 12.10: "## FIXME: impossibile trovare l'URL svn in dependency_link per questo pacchetto:".
— LasseValentini,

32
Mi piacerebbe buttarmi in una teeprima di fare l'aggiornamento effettivo in modo che si può ottenere una lista dei verisons originali. Ad esempio, in pip freeze --local | tee before_upgrade.txt | ...questo modo sarebbe più facile ripristinare in caso di problemi.
— Emil H

10
Ho aggiunto -Hper sudoevitare un fastidioso messaggio di errore: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
— Mario S

683

Puoi usare il seguente codice Python. Diversamente pip freeze, questo non stamperà avvisi ed errori FIXME. Per 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)

Per 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
Funziona incredibilmente bene ... È sempre così soddisfacente quando un'attività richiede davvero molto tempo ... e ti dà un sacco di cose nuove! PS: eseguilo come root se sei su OS X!
— Alex Gray,

52
Non c'è modo di installare usando pip senza chiamare un sottoprocesso? Qualcosa del genere import pip pip.install('packagename')?
— endolito il

6
L'ho concluso in un file fabfile.py . Grazie!
— Josh K,

5
@BenMezger: non dovresti davvero usare i pacchetti di sistema nel tuo virtualenv. Inoltre, in realtà non dovresti eseguire più di una manciata di programmi affidabili e ben noti come root. Esegui virtualenvs con --no-site-pacchetti (predefinito nelle versioni recenti).
— jeffcook2150,

3
Complimenti per questo, la risposta scelta (sopra) non riesce se non è più possibile trovare un pacchetto. Questo script continua semplicemente con i pacchetti successivi, meraviglioso.
— Josh,

644

Per aggiornare tutti i pacchetti locali; potresti usare pip-review:

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

pip-reviewè un fork di pip-tools. Vedi il pip-toolsproblema menzionato da @knedlsepp . pip-reviewpacchetto funziona mapip-tools pacchetto non funziona più.

pip-reviewfunziona su Windows dalla versione 0.5 .


2
@hauzer: non supporta Python 3. Anche se potrebbe essere un bug
— jfs

7
@mkoistinen È un buon strumento ma fino a quando non viene unito in PIP significa installare qualcosa in più che non tutti potrebbero desiderare di fare.
— Wernight,

2
@Daniel: pip-tools non funziona più, pip-review (fork di pip-tools) funziona.
— jfs,

7
pip-review funziona bene (almeno per Python versione 3.5.0)
— FredrikHedman,

16
Per aggiornare tutto senza modalità interattiva:pip-review --local --auto
— Dlamini,

333

Funziona su Windows. Dovrebbe essere buono anche per gli altri. ($ è la directory in cui ti trovi, nel prompt dei comandi, ad es. C: / Utenti / Nome utente>)

fare

$ pip freeze > requirements.txt

aprire il file di testo, sostituire il ==con >=ed eseguire

$ pip install -r requirements.txt --upgrade

Se hai un problema con un certo pacchetto che blocca l'aggiornamento (a volte numpy), vai alla directory ($), commenta il nome (aggiungi un # prima di esso) ed esegui nuovamente l'aggiornamento. Successivamente puoi rimuovere il commento da quella sezione. Questo è ottimo anche per la copia di ambienti globali Python.


Un altro modo:

Mi piace anche il metodo pip-review:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

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

È possibile selezionare 'a' per aggiornare tutti i pacchetti; se un aggiornamento fallisce, eseguirlo di nuovo e continua con quello successivo.


29
È necessario rimuovere requirements.txts' =={version}. Ad esempio: python-dateutil==2.4.2a python-dateutilper tutte le linee.
— youngminz,

4
Ho scoperto che questo non ha effettivamente aggiornato i pacchetti su macOS.
— jkooker

10
@youngminz Consiglierei un breve 'Sostituisci tutto "=="> "> ="' nel tuo editor / ide prima di eseguire 'pip install ...' per risolvere questo problema
— Amaury Liet

7
per Linux: $ pip freeze | cut -d '=' -f1> requirements.txtper rimuovere la versione
— Cavaz

1
Se la shell che usi è bash, puoi accorciarla in un comando tramite pip3 install -r <(pip3 freeze) --upgrade Effectively, <(pip3 freeze)è una pipe anonima, ma fungerà da oggetto file
— Sergiy Kolodyazhnyy,

128

Versione di Windows dopo aver consultato eccellente documentazione per FORRob 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 Più veloce poiché tenterà solo di aggiornare pacchetti "obsoleti"
— Refael Ackermann

3
@RefaelAckermann Sospetto che questo sarà più lento dell'originale :) Per sapere quali pacchetti sono obsoleti pip deve prima controllare qual è l'ultima versione di ogni pacchetto. Fa esattamente lo stesso del primo passo durante l'aggiornamento e non procede se non è disponibile una versione più recente. Tuttavia, nella tua versione pip controllerà le versioni due volte, la prima volta per stabilire l'elenco di pacchetti obsoleti e la seconda volta durante l'aggiornamento dei pacchetti in questo elenco.
— Piotr Dobrogost,

2
@RefaelAckermann La rotazione del pip è un ordine di grandezza più veloce rispetto al controllo della versione di un pacchetto sulla rete, quindi questo è il numero di controlli che dovrebbero essere ottimizzati e non il numero di spin up. Il mio fa n controlli, il tuo fa n + m controlli.
— Piotr Dobrogost,

2
+1 - È il 6.20.2019, sto usando Python 3.7.3 su Windows 10 e questo è stato il modo migliore per aggiornare tutti i miei pacchetti locali.
— MacItaly,

1
Necessità di saltare le prime due righe dell'output: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Se questo viene eseguito da un file batch, assicurarsi di utilizzare al %%iposto di %i. Si noti inoltre che è più pulito aggiornare pipprima di eseguire questo comando utilizzando python -m pip install --upgrade pip.
— Andy,

127

Usa pipupgrade !

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

pipupgrade ti aiuta ad aggiornare il tuo sistema, locale o pacchetti da un requirements.txtfile! Aggiorna anche selettivamente i pacchetti che non interrompono il cambiamento. pipupgrade assicura anche di aggiornare i pacchetti presenti all'interno di più ambienti Python. Compatibile con Python2.7 +, Python3.4 + e pip9 +, pip10 +, pip18 +, pip19 +.

inserisci qui la descrizione dell'immagine

NOTA: sono l'autore dello strumento.


1
Questo metodo ha un output molto più pulito della risposta di @ rbp
— Gaia,

7
Bella idea, ma è bloccato per Checking...sempre quando l'ho provato.
— CGFoX

1
L'ho appena installato e bloccato anche al controllo[0;93mChecking...[0m
— Chris

1
@nathandrake ti interessa aprire un problema nella pagina dei problemi?
— Achille Gasper Rasquinha,

2
Si è verificato un errore su Windows 10 e Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
— Qin Heyang

74

Puoi semplicemente stampare i pacchetti obsoleti

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

14
All'interno di un virtualenv, lo faccio in questo modo:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
— Jeremy Blanchard,

Oggi puoi farlo anche con python -m pip list outdated(anche se non è nel formato dei requisiti).
— Jacktose,

74

Questa opzione mi sembra più semplice e leggibile:

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

La spiegazione è che pip list --outdatedgenera un elenco di tutti i pacchetti obsoleti in questo formato:

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

Nel comando awk, NR>2salta i primi due record (righe) e {print $1}seleziona la prima parola di ogni riga (come suggerito da SergioAraujo, ho rimosso tail -n +3dal momento che awkpuò effettivamente saltare i record).


Se un aggiornamento fallisce, non si verifica nessuno degli aggiornamenti.
— Boris,

2
puoi evitare che la coda awk 'NR>2 {print $1}'pulisca l'output per te
— SergioAraujo,

@SergioAraujo, questo rende la soluzione anche più pulita, grazie per il suggerimento!
— Marc

67

Il seguente one-liner potrebbe essere di aiuto:

(pip> 20,0)

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

Versioni precedenti:

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

xargs -n1 continua se si verifica un errore.

Se hai bisogno di un controllo più "granulare" su ciò che viene omesso e ciò che genera un errore, non dovresti aggiungere il -n1flag e definire esplicitamente gli errori da ignorare, "convogliando" la seguente riga per ogni errore separato:

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

Ecco un esempio funzionante:

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

Ho dovuto aggiungere filtri per le linee che iniziano con 'Could' e 'Some' perché apparentemente pip invia avvisi a stdout :(
— Chip Camden

OK, questo è giusto: puoi aggiungerne quanti ne hai | sed 's/^<First characters of the error>.*//'bisogno. Grazie!
— raratiru,

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

51

Soluzione più robusta

Per pip3 usare questo:

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

Per pip, basta rimuovere i 3 come tali:

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

Stranezze OSX

OSX, a partire da luglio 2017, viene fornito con una versione molto vecchia di sed (una dozzina di anni). Per ottenere espressioni regolari estese, utilizzare -E anziché -r nella soluzione sopra.

Risoluzione di problemi con soluzioni popolari

Questa soluzione è ben progettata e testata 1 , mentre ci sono problemi anche con le soluzioni più popolari.

  • Problemi di portabilità dovuti alla modifica delle funzionalità della riga di comando pip
  • Arresto anomalo di xargs a causa di errori comuni nei processi figlio pip o pip3
  • Registrazione affollata dall'output xargs non elaborato
  • Affidarsi a un bridge Python-to-OS durante l'aggiornamento potenziale 3

Il comando sopra usa la sintassi pip più semplice e portatile in combinazione con sed e sh per superare completamente questi problemi. I dettagli dell'operazione sed possono essere esaminati con la versione commentata 2 .


Dettagli

[1] Testato e utilizzato regolarmente in un cluster Linux 4.8.16-200.fc24.x86_64 e testato su altre cinque versioni Linux / Unix. Funziona anche su Cygwin64 installato su Windows 10. Sono necessari test su iOS.

[2] Per vedere più chiaramente l'anatomia del comando, questo è esattamente l'equivalente del comando pip3 sopra con commenti:

# 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] L'aggiornamento di un componente Python o PIP utilizzato anche nell'aggiornamento di un componente Python o PIP può essere una potenziale causa di un deadlock o di un danneggiamento del database dei pacchetti.


1
un altro modo per superare il giurassico BSD seddi OS X è invece quello di usare gsed(GNU sed). Per ottenerlo,brew install gnu-sed
— Walter Tross,

@WalterTross ... Jurassic ... buon uso dell'aggettivo. Quindi ora abbiamo due modi per raggruppare i pacchetti pip di aggiornamento con una bella pista di controllo sul terminale. (1) Utilizzare l'opzione -E come nella risposta e (2) installare gsed per uscire dal periodo giurassico.
— Douglas Daseeco,

41

Questo sembra più conciso.

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

Spiegazione:

pip list --outdated ottiene linee come queste

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

In cut -d ' ' -f1, -d ' 'imposta "spazio" come delimitatore, -f1significa ottenere la prima colonna.

Quindi le righe sopra diventano:

urllib3
wheel

quindi passali a xargsper eseguire il comando pip install -U, con ogni riga come argomento aggiuntivo

-n1limita il numero di argomenti passati a ciascun comando pip install -Usu 1


Ho ricevuto questo avvisoDEPRECATION: 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: questo perché stai usando Pip v9.0.1. Questo è solo un messaggio di deprecazione che significa che alcune funzionalità non sopravviveranno in una futura versione di Pip. Niente di cui preoccuparsi;)
— AlessioX il

Tuttavia, questa deve essere contrassegnata come soluzione finale. In effetti la risposta accettata verrà eseguita su tutti i pacchetti pip, il che è una perdita di tempo se devi aggiornare solo 1 o 2 pacchetti. Questa soluzione, come invece, verrà eseguito solo su tutti i pacchetti obsoleti
— AlessioX

34

Ho avuto lo stesso problema con l'aggiornamento. Il fatto è che non aggiorno mai tutti i pacchetti. Aggiornamento solo ciò di cui ho bisogno, perché il progetto potrebbe interrompersi.

Poiché non c'era modo semplice per aggiornare pacchetto per pacchetto e aggiornare il file Requisito.txt, ho scritto questo pip-upgrade che aggiorna anche le versioni nel tuo requirements.txtfile per i pacchetti scelti (o tutti i pacchetti).

Installazione

pip install pip-upgrader

uso

Attiva il tuo virtualenv (importante, perché installerà anche le nuove versioni dei pacchetti aggiornati nell'attuale virtualenv).

cd nella directory del progetto, quindi esegui:

pip-upgrade

Utilizzo avanzato

Se i requisiti sono collocati in una posizione non standard, inviarli come argomenti:

pip-upgrade path/to/requirements.txt

Se sai già quale pacchetto vuoi aggiornare, semplicemente inviali come argomenti:

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

Se è necessario eseguire l'aggiornamento alla versione pre-release / post-release, aggiungere --prereleaseargomento al comando.

Divulgazione completa: ho scritto questo pacchetto.


8
Questo è ciò che pip dovrebbe fare di default.
— Nostalg.io,

testa a testa con il tuo strumento alcune fughe di caratteri non sembrano funzionare correttamente sulla mia macchina Windows ma a parte questo va bene
— Luca

non l'ho mai testato su Windows, ma installerò una macchina virtuale. Grazie
— Simion Agavriloaei il

Se virtualenvnon è abilitatopip-upgrade --skip-virtualenv-check
— Morse

2
Funziona anche con una cartella dei requisiti con requisiti comuni, dev e prod. Semplicemente fantastico!
— cwhisperer,


27

Versione di una riga della risposta di @ 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 ("sudo pip install ... nel caso abbiate bisogno di autorizzazioni
— Maximiliano Rios,

4
@MaximilianoRios Per favore, non sudo pip installusare un ambiente virtuale , invece.
— Bengt,

22

quando si utilizza un virtualenv e se si desidera semplicemente aggiornare i pacchetti aggiunti al proprio virtualenv, è possibile che si desideri:

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


18

Soluzione Windows Powershell

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

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

2
Forse pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}sarebbe più appropriato.
— brainplot

16

usa i pacchetti di aggiornamento awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

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


congelamento del pip | awk -F '[=]' '{print $ 1}' | xargs pip install -U
— JohnDHH

E per Python 3 ... pip3 installa -U $ (pip3 freeze | awk -F '[=]' '{print $ 1}')
— Jimmy MG Lim

12

Puoi provare questo:

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

questo è il modo più pulito e leggibile per aggiornare i pacchetti pip con la massima brevità. grande.
— Mark Shust alla M.academy,

12

Il tuorlo piuttosto sorprendente lo rende facile.

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

Per maggiori informazioni sul tuorlo: https://pypi.python.org/pypi/yolk/0.4.3

Può fare molte cose che probabilmente troverai utili.


3
La tua risposta è stata cambiata da yolka yolk3k, la tua risposta originale aveva sicuramente problemi con python3.
— AXO

10

@La risposta di Ramana ha funzionato meglio per me, di quelli qui, ma ho dovuto aggiungere alcune catture:

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

Il site-packagescontrollo esclude i miei pacchetti di sviluppo, perché non si trovano nella directory dei pacchetti del sito di sistema. Try-tranne salta semplicemente i pacchetti che sono stati rimossi da PyPI.

@endolith: speravo anche in una soluzione facile pip.install(dist.key, upgrade=True), ma non sembra che pip fosse pensato per essere utilizzato da tutto tranne che dalla riga di comando (i documenti non menzionano l'API interna e gli sviluppatori di pip non hanno usato docstrings).


Su Ubuntu (e altri derivati ​​Debian), pipapparentemente inserisce pacchetti /usr/local/lib/python2.7/dist-packageso simili. In questo caso è possibile utilizzare '/ usr / local / lib /' invece di 'site-pacchetti' ifnell'istruzione.
— drevicko,

10

La pip_upgrade_outdatedfa il lavoro. Secondo i suoi documenti :

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

Passo 1:

pip install pip-upgrade-outdated

Passo 2:

pip_upgrade_outdated

1
Step 1: pip install pip-upgrade-obsoleto Step 2: pip-upgrade-obsoleto ... fatto
— shao.lo

9

Inviato attraverso una richiesta pull al popolo pip ; nel frattempo usa questa soluzione di libreria pip che ho scritto:

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

Versione con gestione degli errori (come da commento): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
— Samuel Marks

9

Questo sembra funzionare per me ...

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

printfSuccessivamente ho usato uno spazio per separare correttamente i nomi dei pacchetti.


7

Questa è una soluzione PowerShell per Python 3:

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

E per Python 2:

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

Questo aggiorna i pacchetti uno per uno. Quindi a

pip3 check
pip2 check

in seguito dovrebbe assicurarsi che nessuna dipendenza sia interrotta.



7

Il più breve e semplice su Windows.

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

@Enkouyami su Windows 7 questo comando non funziona senza -r. -r deve precludere il percorso al file dei requisiti.
— Chockomonkey,

6

La mia sceneggiatura:

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

6

Non è più efficace?

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 elenca pacchetti obsoleti;
  2. grep -v -i warningcorrispondenza invertita warningper evitare errori durante l'aggiornamento
  3. cut -f1 -d1' ' restituisce la prima parola - il nome del pacchetto obsoleto;
  4. tr "\n|\r" " "converte il risultato cutsu più righe da in un elenco a riga singola, separato da spazi;
  5. awk '{if(NR>=3)print}' salta le righe di intestazione
  6. cut -d' ' -f1 recupera la prima colonna
  7. xargs -n1 pip install -U prende 1 argomento dalla pipe a sinistra e lo passa al comando per aggiornare l'elenco dei pacchetti.

Ecco il mio output: kerberos iwlib PyYAML Could pygpgme Could Could Could ...Nota tutti i "Could" s. Quelli derivano dall'output di pip list -o"Impossibile trovare download che soddisfano il requisito <pacchetto>"
— DrStrangepork,

Puoi incollare l'output di pip list -o?
— Alex V,

I commenti non lo formattano bene, ma ecco uno snippet (le terminazioni di riga sono contrassegnate con ';'):# 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;
— DrStrangepork,

invece di filtrare tutte le righe che non devono essere utilizzati, suggerirei per filtrare le linee in cui esiste un aggiornamento: pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . Altrimenti potresti facilmente perdere una riga che non desideri e ottenere il risultato menzionato da DrStrangeprk.
— antibus

Consiglio vivamente di utilizzare xargsinvece. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UIl -rflag assicura che pip install -Unon verrà eseguito se non ci sono pacchetti obsoleti. Il -pflag richiede all'utente di confermare prima di eseguire qualsiasi comando. È possibile aggiungere il -n1flag per richiederlo prima di installare ciascun pacchetto separatamente.
— Sei

6

una riga in powershell 5.1 con diritti di amministratore, python 3.6.5 e pip ver 10.0.1:

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

funziona senza problemi se non ci sono pacchetti rotti o ruote speciali nell'elenco ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.