2503 votes

Comment mettre à jour tous les paquets Python avec pip ?

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.

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 (comme bundle install o npm 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)

2665voto

rbp Points 8956

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 ).

78 votes

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é... :(

26 votes

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.

2 votes

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

786voto

Ramana Points 2291

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)

27 votes

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 !

58 votes

N'y a-t-il aucun moyen d'installer avec pip sans appeler un sous-processus ? Quelque chose comme import pip pip.install('packagename') ?

1 votes

@aspinei Voir ma réponse pour la version Windows du shell script.

743voto

J.F. Sebastian Points 102961

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 .

0 votes

NameError: name 'raw_input' is not defined -- Cassé pour moi.

2 votes

@hauzer : Il ne supporte pas Python 3. Bien que c'est peut-être un bug

7 votes

@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.

147voto

Piotr Dobrogost Points 14412

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

29 votes

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".

3 votes

@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.

0 votes

@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 :)

75voto

janrito Points 551

Vous pouvez simplement imprimer les paquets qui sont périmés :

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

14 votes

Dans un virtualenv, je fais comme ceci : pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

0 votes

Aujourd'hui, vous pouvez également le faire avec python -m pip list outdated (bien que ce ne soit pas au format des exigences).

4 votes

@Jacktose Je pense que tu voulais dire python -m pip list --outdated .

Prograide.com

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.

Powered by:

X