Come aggiornare tutti i pacchetti di Python con il seme?
Domanda
E 'possibile aggiornare tutti i pacchetti Python in una sola volta con il pip
Nota ??strong>: che ci sia una richiesta di funzionalità per questo sul issue tracker ufficiale.
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.
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 +.
. 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 ??strong>
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
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
- elenca
pip list -o
pacchetti datati; -
grep -v -i warning
invertita matchwarning
ad errori evitare quando l'aggiornamento -
cut -f1 -d1' '
restituisce la prima parola - il nome del pacchetto obsoleto; -
tr "\n|\r" " "
converte il risultato multilinea dacut
in una singola linea, elenco separato da spazi; -
awk '{if(NR>=3)print}'
salta righe di intestazione -
cut -d' ' -f1
recupera la prima colonna -
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ù.