Mise à jour de tous les paquets avec pip

est-il possible de mettre à jour tous les paquets Python en même temps avec pip ?

notez qu'il y a une demande de caractéristique pour cela sur le traceur d'émission officiel.

1470
demandé sur l'L'l 2010-04-27 13:23:25

30 réponses

il n'y a pas encore de drapeau intégré, mais vous pouvez utiliser

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

Note: il y a des variations de potentiel infinies pour cela. J'essaie de garder cette réponse courte et simple, mais s'il vous plaît ne suggèrent des variations dans les commentaires!

dans l'ancienne version de pip , vous pouvez utiliser ceci à la place:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

le grep consiste à sauter les définitions de paquets modifiables ("- e"), comme suggéré par @jawache. (Oui, vous remplacer grep + cut par sed ou awk ou perl or...).

le drapeau -n1 pour xargs empêche d'arrêter tout si la mise à jour d'un paquet échoue (merci @andsens ).

1714
répondu rbp 2018-08-06 13:33:29

vous pouvez utiliser le code Python suivant. Contrairement à pip freeze , ceci 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)
526
répondu Ramana 2018-09-17 12:55:35

pour mettre à jour tous les paquets locaux; vous pouvez utiliser pip-review :

$ pip install pip-review
$ pip-review --local --interactive

pip-review est une fourchette de pip-tools . Voir pip-tools numéro mentionné par @knedlsepp . Le paquet pip-review fonctionne, mais le paquet pip-tools ne fonctionne plus.

pip-review fonctionne sur Windows depuis la version 0.5 .

517
répondu jfs 2017-05-23 12:02:46

fonctionne sur Windows. Devrait être bon pour les autres aussi. ($ est quelque soit le répertoire dans lequel vous êtes, dans l'invite de commande. par exemple. C:/Users/Username>)

faire

$ pip freeze > requirements.txt

ouvrir le fichier texte, remplacer le = = > =

puis faites

$ pip install -r requirements.txt --upgrade

si vous avez un problème avec un certain paquet qui bloque la mise à jour (num PY parfois), allez simplement dans le répertoire ( $ ), commentez le nom (ajoutez un # avant) et lancez la mise à niveau à nouveau. Vous pouvez plus tard découpler cette section. C'est aussi parfait pour copier des environnements globaux python.

j'aime aussi le pip-méthode d'examen de l':

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

vous pouvez sélectionner " a " pour mettre à jour tous les paquets; si une mise à jour échoue, lancez-la à nouveau et elle continue à la prochaine.

194
répondu azazelspeaks 2018-03-20 19:47:45

version Windows après consultation excellent documentation pour FOR par Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
91
répondu Piotr Dobrogost 2018-04-26 15:29:47

vous pouvez juste imprimer les paquets qui sont périmés

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
70
répondu janrito 2011-06-10 12:50:49

la doublure suivante pourrait s'avérer utile:

pip list --format legacy --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 continue si une erreur se produit.

si vous avez besoin de plus de contrôle" à grain fin "sur ce qui est omis et ce qui soulève une erreur, vous ne devez pas ajouter le drapeau -n1 et définir explicitement les erreurs à ignorer, en "piping" la ligne suivante pour chaque erreur séparée:

| sed 's/^<First characters of the error>.*//'

Voici un exemple pratique:

pip list --format legacy --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U
57
répondu raratiru 2017-08-02 19:49:25

cette option me semble plus simple et plus lisible:

pip install -U `pip list --outdated | awk '{ print }'`

( awk '{ print }' sélectionne le premier mot de la ligne (séparés par un espace))

et cette version permet la suppression du message d'avertissement de pip list --outdated :

pip install -U `pip list --outdated | awk '!/Could not|ignored/ { print }'`

( awk '!/<pattern>/' supprime la ligne contenant un motif donné. Dans mon cas, les messages d'avertissement comprennent "ne pouvait pas" et "ignoré" respectivement)

cela pourrait également être utilisé pour aborder la prochaine valeur par défaut columns format:

pip install -U `pip list --format=columns --outdated | awk '!/Package|---/{ print }'`
42
répondu Marc 2017-06-23 09:05:36

cela semble plus concis.

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

explication:

pip list --outdated obtient des lignes, comme ces

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

Dans cut -d ' ' -f1 , -d ' ' jeux "space" comme séparateur -f1 les moyens pour obtenir la première colonne.

ainsi les lignes ci-dessus deviennent:

urllib3
wheel

puis passez-les à xargs pour exécuter la commande, pip install -U , avec chaque ligne en annexe arguments

-n1 limite le nombre d'arguments passés à chaque commande pip install -U à 1

33
répondu Shihao Xu 2016-12-18 18:30:49

de https://github.com/cakebread/yolk :

$ pip install -U `yolk -U | awk '{print }' | uniq`

cependant, vous devez obtenir jaune d'abord:

$ sudo pip install -U yolk
26
répondu tkr 2013-01-03 18:02:09

Solution Plus Robuste

pour pip3 utiliser ceci:

pip3 freeze --local |sed -rn 's/^([^=# \t\][^ \t=]*)=.*/echo; echo Processing  ...; pip3 install -U /p' |sh

pour pip, il suffit de supprimer les 3s comme tel:

pip freeze --local |sed -rn 's/^([^=# \t\][^ \t=]*)=.*/echo; echo Processing  ...; pip install -U /p' |sh

OSX Bizarrerie

OSX, à partir de juillet 2017, navires 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çu et testé 1 , alors qu'il ya des problèmes avec même les solutions les plus populaires.

  • problèmes de portabilité en raison de la modification des caractéristiques de la ligne de commande pip
  • Panne de xargs cause commune pip ou pip3 enfant défaillances de processus
  • Bondé de journalisation de la crue xargs sortie
  • S'appuyant sur un pont Python-to-OS tout en l'améliorant potentiellement 3

la commande ci-dessus utilise la syntaxe pip la plus simple et la plus portable en combinaison avec sed et sh pour surmonter ces problèmes complètement. Les détails du fonctionnement de sed peuvent être examinés avec la version commentée 2 .


Détails

[1] testé et utilisé régulièrement sous Linux 4.8.16-200.fc24.x86_64 cluster et testé sur cinq autres versions de Linux/Unix. Il fonctionne également sur Cygwin64 installé sur Windows 10. Des tests sur iOS sont nécessaires.

[2] pour voir plus clairement l'anatomie de la commande, 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  ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U "

# 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'une impasse ou d'une corruption de la base de données package.

25
répondu Douglas Daseeco 2017-07-30 00:46:36

One-liner version de la réponse de @Ramana .

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`

23
répondu Salman Abbas 2018-04-26 15:32:10

j'ai eu le même problème avec la mise à niveau. Le truc, c'est que je ne mets jamais à jour tous les paquets. Je ne mets à jour que ce dont j'ai besoin, parce que le projet peut s'arrêter.

parce qu'il n'y avait pas de moyen facile de mettre à jour paquet par paquet, et de mettre à jour les exigences.fichier txt, j'ai écrit ce pip-valorisation qui met également à jour les versions requirements.txt fichier pour les paquets choisi (ou tous les paquets).

Installation

pip install pip-upgrader

Utilisation

activez votre virtualenv (important, car il installera également les nouvelles versions des paquets mis à jour dans virtualenv actuel).

cd dans votre répertoire de projets, puis lancez:

pip-upgrade

usage avancé

si la les exigences sont placées dans un emplacement non standard, envoyez-les comme arguments:

pip-upgrade path/to/requirements.txt

si vous savez déjà quel paquet vous voulez mettre à jour, envoyez-les simplement en arguments:

pip-upgrade -p django -p celery -p dateutil

si vous devez passer à la version pré-ou post-publication, ajoutez l'argument --prerelease à votre commande.

Full disclosure: j'ai écrit ce package.

21
répondu Simion Agavriloaei 2017-04-26 18:43:47

lors de l'utilisation d'un virtualenv et si vous voulez simplement mettre à jour les paquets a ajouté à votre virtualenv, vous pouvez faire:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
15
répondu brunobord 2011-09-13 09:42:32

Vous pouvez essayer ceci :

for i in ` pip list|awk -F ' ' '{print }'`;do pip install --upgrade $i;done
12
répondu 何宗翰 2013-07-17 02:01:32

Windows Powershell solution

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
12
répondu Apeirogon Prime 2016-09-16 09:07:18

la solution la plus simple et la plus rapide que j'ai trouvée dans la discussion sur la question du pip est:

sudo -H pip install pipdate
sudo -H pipdate

Source: https://github.com/pypa/pip/issues/3819

12
répondu RedEyed 2017-09-13 08:34:01

le jaune assez étonnant rend cela facile.

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

pour plus d'informations sur le jaune: https://pypi.python.org/pypi/yolk/0.4.3

il peut faire beaucoup de choses que vous trouverez probablement utiles.

11
répondu user1175849 2016-07-26 16:34:48

envoyé par un pull-request au PIP folk ; dans l'intervalle utiliser cette solution de bibliothèque pip j'ai écrit:

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
9
répondu Samuel Marks 2014-01-26 09:31:33

cela a semblé fonctionner pour moi...

pip install -U $(pip list --outdated|awk '{printf " "}')

j'ai utilisé printf avec un espace après pour séparer correctement les noms de paquets.

9
répondu SaxDaddy 2015-08-05 22:20:06

la réponse de @Ramana a fonctionné le mieux pour moi, de ceux ici, mais j'ai dû ajouter quelques captures:

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

la vérification site-packages exclut mes paquets de développement, parce qu'ils ne sont pas situés dans le répertoire système site-paquets. L'essai-sauf qu'il saute tout simplement les paquets qui ont été retirés de PyPI.

@endolith: j'espérais aussi un facile pip.install(dist.key, upgrade=True) , mais il ne semble pas que pip était censé être utilisé par tout sauf la ligne de commande (les docs ne mentionnent pas L'API interne, et les développeurs pip n'ont pas utilisé docstrings).

9
répondu chbrown 2018-04-26 15:31:59

mon script:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
6
répondu Icyblade 2017-01-10 02:17:17

N'est-ce pas plus 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 
  1. pip list -o liste les colis périmés;
  2. grep -v -i warning correspondance inversée sur warning pour éviter les erreurs lors de la mise à jour
  3. cut -f1 -d1' ' renvoie le premier mot - le nom du paquet périmé;
  4. tr "\n|\r" " " convertit le résultat multiligne de cut en une seule ligne, séparée par des espaces;
  5. awk '{if(NR>=3)print}' saute des lignes d'en-tête
  6. cut -d' ' -f1 va chercher la première colonne
  7. xargs -n1 pip install -U prend 1 argument de la pipe gauche de celui-ci, et le passe à la commande pour mettre à jour la liste des paquets.
6
répondu Alex V 2017-06-25 14:11:51

Que Diriez-vous de:

pip install -r <(pip freeze) --upgrade
5
répondu user8598996 2017-09-12 16:50:29

utiliser awk update packges: pip install -U $(pip freeze | awk -F'[=]' '{print }')

5
répondu JohnDHH 2017-11-09 09:19:19

voici ma variation sur la réponse de rbp, qui court-circuite" modifiable " et les distributions de développement. Il partage deux défauts de l'original: il se télécharge et se réinstalle inutilement; et une erreur sur un paquet empêchera la mise à niveau de chaque paquet après cela.

pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --

rapports de bogues relatifs, un peu disjoints après la migration de bitbucket:

4
répondu Tobu 2011-05-26 08:30:43

j'ai essayé le code de Ramana et j'ai découvert sur Ubuntu que vous devez écrire sudo pour chaque commande. Voici mon script qui fonctionne très bien sur ubuntu 13.10:

#!/usr/bin/env python
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("sudo pip install --upgrade " + dist.project_name, shell=True)
4
répondu antibus 2014-04-10 16:48:23

voici une autre façon de faire avec un script en python

import pip, tempfile, contextlib

with tempfile.TemporaryFile('w+') as temp:
    with contextlib.redirect_stdout(temp):
        pip.main(['list','-o'])
    temp.seek(0)
    for line in temp:
        pk = line.split()[0]
        print('--> updating',pk,'<--')
        pip.main(['install','-U',pk])
4
répondu Copperfield 2016-04-11 23:07:42

voici un script qui ne met à jour que les paquets périmés.

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "--outdated", "--format=legacy"])
line = str(file).split()

for distro in line[::6]:
    call("pip install --upgrade " + distro, shell=True)
4
répondu Storm Shadow 2016-11-04 16:21:02

j'ai utilisé pur dernièrement. C'est simple et au point. Il met à jour votre fichier requirements.txt pour refléter les mises à niveau et vous pouvez ensuite mettre à niveau avec votre fichier requirements.txt comme d'habitude.

$ pip install pur
...
Successfully installed pur-4.0.1

$ pur
Updated boto3: 1.4.2 -> 1.4.4
Updated Django: 1.10.4 -> 1.10.5
Updated django-bootstrap3: 7.1.0 -> 8.1.0
All requirements up-to-date.

$ pip install --upgrade -r requirements.txt
Successfully installed Django-1.10.5 ...
4
répondu kichik 2017-02-16 01:38:26