Est-il possible de mettre à jour tous les paquets Python en une seule fois avec pip
?
Note : qu'il y a une demande de fonctionnalité pour ce problème sur la plateforme officielle de suivi des problèmes.
Est-il possible de mettre à jour tous les paquets Python en une seule fois avec pip
?
Note : qu'il y a une demande de fonctionnalité pour ce problème sur la plateforme officielle de suivi des problèmes.
Il n'y a pas encore d'indicateur intégré, mais vous pouvez utiliser la fonction
pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
Remarque : il existe une infinité de variantes possibles. J'essaie de garder cette réponse courte et simple, mais n'hésitez pas à suggérer des variations dans les commentaires !
Dans les anciennes versions de pip
vous pouvez utiliser ceci à la place :
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
El grep
est d'ignorer les définitions de paquets modifiables ("-e"), comme suggéré par @jawache. (Oui, vous pouvez remplacer grep
+ cut
con sed
o awk
o perl
ou...).
El -n1
pour xargs
empêche de tout arrêter si la mise à jour d'un paquet échoue (merci @andsens ).
Exact :( Le problème se trouve maintenant à github.com/pypa/pip/issues/59 . Mais à chaque suggestion, on semble répondre par "Oui, mais je ne suis pas sûr que X soit la bonne façon de faire Y"... Mieux vaut maintenant que jamais ? L'aspect pratique l'emporte sur la pureté... :(
Il imprime également les paquets qui ont été installés avec un gestionnaire de paquets normal (comme apt-get ou Synaptic). Si j'exécute ceci pip install -U
il mettra à jour tous les paquets. J'ai peur que cela puisse causer un conflit avec apt-get.
Spot on - j'ai ajouté une exclusion au grep pour ignorer les paquets modifiables. pip freeze --local | grep -v "\-e" | cut -d = -f 1 | xargs pip install -U
Vous pouvez utiliser le code Python suivant. Contrairement à pip freeze
cela n'imprimera pas les avertissements et les erreurs FIXME. Pour 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)
Pour 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)
Cela fonctionne étonnamment bien C'est toujours si satisfaisant quand une tâche prend un VRAI longue période et vous donne un bouquet de fleurs de nouvelles choses ! PS : Exécutez-le en tant que Root si vous êtes sous OS X !
N'y a-t-il aucun moyen d'installer avec pip sans appeler un sous-processus ? Quelque chose comme import pip
pip.install('packagename')
?
Pour mettre à jour tous les paquets locaux, vous pouvez installer pip-review
:
$ pip install pip-review
Après cela, vous pouvez soit mettre à niveau les paquets de manière interactive :
$ pip-review --local --interactive
Ou automatiquement :
$ pip-review --local --auto
pip-review
est une bifurcation de pip-tools
. Voir pip-tools
numéro mentionné par @knedlsepp . pip-review
fonctionne mais pip-tools
ne fonctionne plus.
pip-review
fonctionne sous Windows depuis la version 0.5 .
@mkoistinen C'est un bon outil, mais tant qu'il n'est pas intégré au PIP, il faut installer quelque chose de supplémentaire, ce que tout le monde ne souhaite pas forcément faire.
Version Windows après avoir consulté l'excellent la documentation pour FOR
par Rob van der Woude :
for /F "delims===" %i in ('pip freeze') do pip install --upgrade %i
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i
Plus rapide car il n'essaiera de mettre à jour que les paquets "périmés".
@RefaelAckermann Je pense que ce sera plus lent que l'original :) Pour savoir quels paquets sont périmés, Pip doit d'abord vérifier quelle est la dernière version de chaque paquet. Il fait exactement la même chose que la première étape de la mise à jour et ne procède pas s'il n'y a pas de version plus récente disponible. Cependant, dans votre version, pip vérifiera les versions deux fois, la première fois pour établir la liste des paquets périmés et la seconde fois lors de la mise à jour des paquets de cette liste.
@PiotrDobrogost, Si nous voulons analyser cela de manière rigoureuse ;) laissons n
est le nombre de paquets installés, et m
<= n
nombre de paquets "périmés". Le vôtre va faire un spin-up pip
pour TOUS les paquets pour 1 + n
les exécutions de pip
con n*log(n)
des recherches sur le web pour les versions et toutes les dépendances, et m
téléchargements et installations. Le mien fera n
les recherches sur le web pour le --outdated
appel puis seulement spinup m
pip
appels avec m*log(n)
recherche de dépendances sur le web + m
télécharger et installer. pour si m
<< n
Je gagne :)
Dans un virtualenv, je fais comme ceci : pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Aujourd'hui, vous pouvez également le faire avec python -m pip list outdated
(bien que ce ne soit pas au format des exigences).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
60 votes
Méfiez-vous de pourriture du logiciel -La mise à jour des dépendances peut casser votre application. Vous pouvez lister la version exacte de tous les paquets installés avec
pip freeze
(commebundle install
onpm shrinkwrap
). Il est préférable d'en sauvegarder une copie avant de bricoler.3 votes
Si vous souhaitez mettre à jour un seul paquet et l'ensemble de son dépendances (sans doute une approche plus raisonnable), faites ceci : pip install -U --upgrade-strategy eager votre-package
8 votes
J'utilise PowerShell 7 et j'utilise actuellement ce one-liner :
pip list --format freeze | %{pip install --upgrade $_.split('==')[0]}
(Je ne suis pas encore en mesure de poster une réponse ici)