Domanda

E 'possibile aggiornare tutti i pacchetti Python in una sola volta con il pip

Nota : che ci sia una richiesta di funzionalità per questo sul issue tracker ufficiale.

È stato utile?

Soluzione

Non c'è un built-in di bandiera ancora, ma è possibile utilizzare

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

Nota: ci sono potenziali variazioni infinite per questo. Sto cercando di mantenere questa risposta breve e semplice, ma vi prego 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 modificabile ( "-e") delle definizioni di pacchetto, come suggerito da @jawache. (Sì, è possibile sostituire grep + cut con sed o awk o perl o ...).

Il flag -n1 per evita xargs arresto tutto se aggiornando un pacchetto fallisce (grazie @andsens ).

Altri suggerimenti

È possibile utilizzare il seguente codice Python. A differenza di pip freeze, questo non stamperà avvertimenti 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)

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

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

pip-review è un fork di pip-tools. Vedere pip-tools problema citato da @ knedlsepp . pacchetto funziona pip-review ma pacchetto pip-tools non funziona più.

pip-review funziona su Windows a partire dalla versione 0.5 .

Opere su Windows. Dovrebbe essere buono anche per gli altri. ($ È qualunque directory si trovi, nel prompt dei comandi, ad esempio C:.. / Users / nomeutente>)

do

$ 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 stallo l'aggiornamento (NumPy a volte), basta andare alla directory ($), commentare il nome (aggiungere un # prima di esso) ed eseguire nuovamente l'aggiornamento. In seguito sarà possibile rimuovere il commento che sezione posteriore. Questo è grande anche per la copia di ambienti globali pitone.


Un altro modo:

Mi piace anche il metodo di 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 uno aggiornamento non riesce, eseguirlo di nuovo e continua a quella successiva.

versione di Windows dopo aver consultato eccellente per FOR da Rob van der Woude

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

pipupgrade !

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

pipupgrade consente di aggiornare il sistema, locale o pacchetti da un file requirements.txt! Inoltre aggiorna in modo selettivo i pacchetti che non si rompono il cambiamento. pipupgrade assicura anche per aggiornare i pacchetti presenti all'interno di più ambienti Python. Compatibile con Python2.7 +, Python3.4 + e + pip9, PIP10 +, pip18 +, pip19 +.

 entrare descrizione dell'immagine qui

. NOTA: Sono l'autore dello strumento

Si può solo stampare i pacchetti che non sono aggiornati

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

Di seguito uno-liner potrebbe rivelarsi di aiuto:

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

xargs -n1 continua ad andare in caso di errore.

Se avete bisogno di più "a grana fine" il controllo su ciò che viene omesso e ciò che genera un errore non si dovrebbe aggiungere il flag -n1 ed esplicitamente definire gli errori di ignorare, per "piping" la seguente riga per ogni errore a parte:

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

Ecco un esempio di lavoro:

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

Questa opzione mi sembra più semplice e leggibile:

pip install -U `pip list --outdated | tail -n +3 | awk '{print $1}'`

La spiegazione è che pip list --outdated emette un elenco di tutti i pacchetti datati 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

tail -n +3 salta le prime due righe e seleziona awk '{print $1}' la prima parola di ogni riga.

soluzione più robusta

Per PIP3 usano questo:

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

Per pip, è sufficiente rimuovere la 3s in quanto tali:

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

OSX Oddity

OSX, a partire da luglio 2017, viene fornito con una versione molto vecchia di sed (una decina di anni). Per ottenere le espressioni regolari estese, l'uso -E invece di -r nella soluzione di cui sopra.

Risoluzione dei problemi di con le soluzioni popolari

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

  • problemi di portabilità a causa di cambiare linea di comando pip dispone
  • L'arresto di xargs perché errori del processo comune pip o un bambino PIP3
  • la registrazione Affollato dall'uscita xargs grezza
  • Basandosi su un ponte Python-to-OS mentre potenzialmente aggiornarlo 3

Il comando sopra utilizza la sintassi pip più semplice e portatile, in combinazione con sed e sh per superare completamente questi problemi. Dettagli di funzionamento sed possono essere esaminati con la versione commentata 2 .


Dettagli

[1] Testato e regolarmente utilizzato in un cluster di Linux 4.8.16-200.fc24.x86_64 e testato su altri cinque sapori Linux / Unix. Funziona anche su Cygwin64 installato su Windows 10. La sperimentazione su iOS è necessaria.

[2] Per vedere l'anatomia del comando in modo più chiaro, questo è l'esatto equivalente del comando PIP3 sopra con i 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] Aggiornamento di un componente di Python o PIP che viene utilizzato anche nella riqualificazione di un componente Python o PIP può essere una potenziale causa di una situazione di stallo o di un pacchetto danneggiamento del database.

Questo sembra più concisa.

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

Spiegazione:

pip list --outdated ottiene linee come questi

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

cut -d ' ' -f1, set -d ' ' "spazio" come delimitatore, mezzi -f1 per ottenere la prima colonna.

Quindi, le linee di cui sopra diventa:

urllib3
wheel

poi passare alla xargs per eseguire il comando, pip install -U, con ogni riga come aggiungendo argomenti

-n1 limita il numero di argomenti passati ad ogni pip install -U comando sia 1

Ho avuto lo stesso problema con l'aggiornamento. Il fatto è che non ho mai aggiorna tutti i pacchetti. Aggiorno solo quello che mi serve, perché progetto potrebbe rompersi.

Perché non c'era modo semplice per il pacchetto di aggiornamento per il pacchetto, e l'aggiornamento del file requirements.txt, ho scritto questo pip-Upgrader che aggiorna anche le versioni in file requirements.txt per i pacchetti scelti (o tutti i pacchetti).

Installazione

pip install pip-upgrader

Utilizzo

Attiva la tua virtualenv (importante, perché sarà anche installare le nuove versioni dei pacchetti aggiornati in virtualenv corrente).

cd nella directory del progetto, quindi eseguire:

pip-upgrade

Uso 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 si desidera aggiornare, semplicemente inviarli come argomenti:

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

Se è necessario eseguire l'aggiornamento a versione preliminare / post-release, aggiungere argomento --prerelease al comando.

Full disclosure:. Ho scritto questo pacchetto

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

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

tuttavia è necessario ottenere prima il tuorlo:

$ sudo pip install -U yolk

Una versione-liner di @ di Ramana risposta .

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

`

quando si utilizza un virtualenv e se si vuole solo aggiornare i pacchetti aggiunto per la vostra virtualenv, si consiglia di fare:

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

soluzione Windows PowerShell

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

La soluzione più semplice e veloce che ho trovato nel href="https://github.com/pypa/pip/issues/3819#issuecomment-286696776" rel="noreferrer"> pip discussione è:

sudo -H pip install pipdate
sudo -H pipdate

Fonte: https://github.com/pypa/pip/issues/3819

Si può provare questo:

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

Il tuorlo piuttosto sorprendente rende questo facile.

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

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

Si può fare un sacco di cose che probabilmente troverete utile.

pacchetti di aggiornamento uso 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]}

@ di Ramana risposta lavorato il meglio per me, di quelli che sono qui, ma ho dovuto aggiungere un paio di 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

Sono esclusi controllo site-packages miei pacchetti di sviluppo, perché non si trovano nella directory site-packages di sistema. Il try-except semplicemente salta pacchetti che sono stati rimossi da PyPI.

@endolith: speravo in un pip.install(dist.key, upgrade=True) facile, troppo, ma non assomiglia pip stato concepito per essere utilizzato da qualsiasi cosa, ma la linea di comando (i documenti non menzionano l'API interna, e gli sviluppatori pip non ha usato docstring).

un pull-richiesta al PIP popolare ; nel frattempo utilizzare questa soluzione libreria pip 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

Questo sembrava funzionare per me ...

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

ho usato printf con uno spazio poi per separare correttamente i nomi dei pacchetti.

Il più breve e più facile su Windows.

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

Il mio script:

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

Non è questo 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. elenca pip list -o pacchetti datati;
  2. grep -v -i warning invertita match warning ad errori evitare quando l'aggiornamento
  3. cut -f1 -d1' ' restituisce la prima parola - il nome del pacchetto obsoleto;
  4. tr "\n|\r" " " converte il risultato multilinea da cut in una singola linea, elenco separato da spazi;
  5. awk '{if(NR>=3)print}' salta righe di intestazione
  6. cut -d' ' -f1 recupera la prima colonna
  7. xargs -n1 pip install -U prende 1 argomento dal tubo sinistra di esso, e lo passa al comando per aggiornare la lista dei pacchetti.

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] }

Questa aggiorna i pacchetti uno per uno. Quindi un

pip3 check
pip2 check

poi necessario assicurarsi dipendenze sono rotti.

Come su:

pip install -r <(pip freeze) --upgrade

Il pip_upgrade_outdated fa il lavoro. Secondo il suo docs :

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

Passaggio 1:

pip install pip-upgrade-outdated

Passaggio 2:

pip_upgrade_outdated
import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
    pip.main(['install', '--upgrade', pkg])

o anche:

import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)

Opere veloce in quanto non sta lanciando costantemente un guscio. Mi piacerebbe trovare il tempo per ottenere questo in realtà utilizzando l'elenco obsoleto per accelerare le cose ancora di più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top