Solution plus robuste
Pour pip3, utilisez ceci:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Pour pip, il suffit de retirer les 3 comme tels:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OSX Oddity
OSX, à partir de juillet 2017, est livré avec une très ancienne version de sed (une douzaine d'années). Pour obtenir des expressions régulières étendues, utilisez -E au lieu de -r dans la solution ci-dessus.
Résoudre les problèmes avec des solutions populaires
Cette solution est bien conçue et testée 1 , alors que même les solutions les plus courantes posent des problèmes.
- Problèmes de portabilité dus à la modification des fonctionnalités de la ligne de commande pip
- Blocage de xargs en raison d'échecs courants du processus enfant pip ou pip3
- Journalisation encombrée à partir de la sortie xargs brute
- S'appuyer sur un pont Python-à-OS tout en le mettant potentiellement à niveau 3
La commande ci-dessus utilise la syntaxe pip la plus simple et la plus portable en combinaison avec sed et sh pour surmonter complètement ces problèmes. Les détails de l'opération sed peuvent être examinés avec la version commentée 2 .
Détails
[1] Testé et régulièrement utilisé dans un cluster Linux 4.8.16-200.fc24.x86_64 et testé sur cinq autres versions Linux / Unix. Il fonctionne également sur Cygwin64 installé sur Windows 10. Des tests sur iOS sont nécessaires.
[2] Pour voir l'anatomie de la commande plus clairement, c'est l'équivalent exact de la commande pip3 ci-dessus avec des commentaires:
# 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] La mise à niveau d'un composant Python ou PIP qui est également utilisé dans la mise à niveau d'un composant Python ou PIP peut être une cause potentielle d'un blocage ou d'une corruption de base de données de package.
pip freeze
(commebundle install
ounpm shrinkwrap
). Mieux vaut en sauvegarder une copie avant de bricoler.