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.