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.
pip freeze
(likebundle install
onpm shrinkwrap
). Meglio salvarne una copia prima di armeggiare.