Comment mettre à jour tous les packages Python avec pip?

2054

Est-il possible de mettre à niveau tous les packages Python en même temps avec pip?

Remarque : il existe une demande de fonctionnalité pour cela sur le traqueur de problème officiel.

thedjpetersen
la source
37
Méfiez-vous de la pourriture logicielle - les dépendances de mise à niveau peuvent casser votre application. Vous pouvez lister la version exacte de tous les packages installés avec pip freeze(comme bundle installou npm shrinkwrap). Mieux vaut en sauvegarder une copie avant de bricoler.
Colonel Panic
Méfiez-vous lorsque vous faites cela, vous bousiller votre pipinstallation, lors de la mise à niveau requests. Le message d'erreur est cannot import name IncompleteRead.
Paul Rooney
11
J'ai essayé un tas de réponses et une nouvelle (et donc une réponse à faible score) produit une bien meilleure sortie: stackoverflow.com/questions/2720014/…
FauChristian
Demande de fonctionnalité et discussion à jour: github.com/pypa/pip/issues/4551
cledoux
Cette question est à la fois si ancienne et si utile, je veux juste alerter quiconque vient ici à partir de maintenant qu'il existe maintenant une nouvelle meilleure façon officielle de faire tout cela: pipenv. Les documents sont ici: docs.pipenv.org/basics et l'auteur Pycon 2018 en parle ici: youtube.com/watch?v=GBQAKldqgZs . Bon codage!
Malik A. Rumi

Réponses:

2263

Il n'y a pas encore d'indicateur intégré, mais vous pouvez utiliser

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

Remarque: il existe des variations de potentiel infinies pour cela. J'essaie de garder cette réponse courte et simple, mais veuillez suggérer 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

La fonction grepconsiste à ignorer les définitions de packages modifiables ("-e"), comme suggéré par @jawache. (Oui, vous pouvez remplacer grep+ cutpar sedou awkou perlou ...).

L' -n1indicateur pour xargsempêche tout arrêter si la mise à jour d'un package échoue (merci @andsens ).

rbp
la source
59
Droite :( Le problème se trouve maintenant sur github.com/pypa/pip/issues/59 . Mais chaque suggestion semble avoir une réponse par "Ouais, mais je suis trop sûr si X est la bonne façon de faire Y" ... Maintenant, c'est mieux que jamais? La
praticité
20
Il imprime également les packages installés avec un gestionnaire de packages normal (comme apt-get ou Synaptic). Si j'exécute cela pip install -U, il mettra à jour tous les packages. J'ai peur que cela puisse provoquer des conflits avec apt-get.
Jabba
8
Que diriez-vous de changer grep en: egrep -v '^ (\ - e | #)' (j'obtiens cette ligne lors de son exécution sur ubuntu 12.10: "## FIXME: impossible de trouver l'URL svn dans dependency_links pour ce paquet:".
LasseValentini
32
Je jetterais un teeavant de faire la mise à niveau réelle afin que vous puissiez obtenir une liste des versions originales. Par exemple pip freeze --local | tee before_upgrade.txt | ..., il serait plus facile de revenir en arrière en cas de problème.
Emil H
10
J'ai ajouté -Hpour sudoéviter un message d'erreur ennuyeux: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Mario S
683

Vous pouvez utiliser le code Python suivant. Contrairement à pip freezecela, 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)
Manishankar Singh
la source
21
Cela fonctionne étonnamment bien ... Il est toujours aussi satisfaisant quand une tâche prend vraiment beaucoup de temps ... et vous donne un tas de choses nouvelles! PS: exécutez-le en tant que root si vous êtes sous OS X!
Alex Gray
52
Est-il impossible d'installer à l'aide de pip sans appeler un sous-processus? Quelque chose comme ça import pip pip.install('packagename')?
endolith
6
J'ai enveloppé cela dans un fabfile.py . Merci!
Josh K
5
@BenMezger: Vous ne devriez vraiment pas utiliser de packages système dans votre virtualenv. Vous ne devriez pas non plus exécuter plus d'une poignée de programmes fiables et bien connus en tant que root. Exécutez vos virtualenvs avec --no-site-packages (par défaut dans les versions récentes).
jeffcook2150
3
Bravo pour celui-ci, la réponse choisie (ci-dessus) échoue si un paquet ne peut plus être trouvé. Ce script continue simplement vers les prochains packages, merveilleux.
Josh
644

Pour mettre à niveau tous les packages locaux; vous pourriez utiliser pip-review:

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

pip-reviewest une fourchette de pip-tools. Voir le pip-toolsproblème mentionné par @knedlsepp . pip-reviewle package fonctionne mais le pip-toolspackage ne fonctionne plus.

pip-reviewfonctionne sur Windows depuis la version 0.5 .

jfs
la source
2
@hauzer: Il ne prend pas en charge Python 3. Bien que cela puisse être un bug
jfs
7
@mkoistinen C'est un bon outil mais jusqu'à ce qu'il soit fusionné dans PIP, cela signifie installer quelque chose de plus que tout le monde ne souhaite pas faire.
Wernight
2
@Daniel: pip-tools ne fonctionne plus, pip-review (fork of pip-tools) fonctionne.
jfs du
7
pip-review fonctionne très bien (au moins pour Python version 3.5.0)
FredrikHedman
16
Pour tout mettre à jour sans mode interactif:pip-review --local --auto
Dlamini
333

Fonctionne sous Windows. Cela devrait aussi être bon pour les autres. ($ est le répertoire dans lequel vous vous trouvez, à l'invite de commande. Par exemple. C: / Users / Username>)

faire

$ pip freeze > requirements.txt

ouvrez le fichier texte, remplacez le ==par >=et exécutez

$ pip install -r requirements.txt --upgrade

Si vous avez un problème avec un certain paquet bloquant la mise à niveau (numpy parfois), allez simplement dans le répertoire ($), commentez le nom (ajoutez un # avant) et relancez la mise à niveau. Vous pourrez ultérieurement supprimer la mise en commentaire de cette section. C'est également idéal pour copier des environnements globaux python.


Autrement:

J'aime aussi la méthode pip-review:

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 à niveau tous les packages; si une mise à niveau échoue, exécutez-la à nouveau et elle se poursuit à la suivante.

azazelspeaks
la source
29
Vous devez supprimer requirements.txt« s =={version}. Par exemple: python-dateutil==2.4.2à python-dateutilpour toutes les lignes.
youngminz
4
J'ai trouvé que cela n'a pas réellement mis à niveau les packages sur macOS.
jkooker
10
@youngminz Je recommanderais un rapide 'Remplacer tout "=="> "> ="' dans votre éditeur / ide avant d'exécuter 'pip install ...' pour résoudre ce problème
Amaury Liet
7
pour linux: $ pip freeze | cut -d '=' -f1> requirements.txtafin de supprimer la version
Cavaz
1
Si le shell que vous utilisez est bash, vous pouvez le raccourcir en une seule commande via pip3 install -r <(pip3 freeze) --upgrade Effectivement, <(pip3 freeze)est un canal anonyme, mais il agira comme un objet fichier
Sergiy Kolodyazhnyy
128

Version Windows après avoir consulté une excellente documentation pour FORpar Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
Piotr Dobrogost
la source
19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Plus rapide car il n'essaiera que de mettre à jour les packages "obsolètes"
Refael Ackermann
3
@RefaelAckermann Je soupçonne que ce sera plus lent que l'original :) Pour savoir quels packages sont obsolètes, pip doit d'abord vérifier quelle est la dernière version de chaque package. Il fait exactement la même chose que la première étape lors de la mise à jour et ne se poursuit pas si aucune version plus récente n'est disponible. Cependant, dans votre version, pip vérifiera les versions deux fois, la première fois pour établir la liste des packages obsolètes et la deuxième fois lors de la mise à jour des packages sur cette liste.
Piotr Dobrogost
2
@RefaelAckermann La rotation de pip est d'un ordre de grandeur plus rapide que la vérification de la version d'un package sur le réseau, c'est donc le nombre de vérifications qui doivent être optimisées et non le nombre de rotations. Le mien fait n chèques, le vôtre fait n + m chèques.
Piotr Dobrogost
2
+1 - Nous sommes le 6.20.2019, j'utilise Python 3.7.3 sur WIndows 10, et c'était le meilleur moyen pour moi de mettre à jour tous mes packages locaux.
MacItaly
1
Vous avez besoin de sauter les deux premières lignes de la sortie: for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Si cela est exécuté à partir d'un fichier de commandes, assurez-vous d'utiliser à la %%iplace de %i. Notez également qu'il est plus propre de mettre à jour pipavant d'exécuter cette commande à l'aide de python -m pip install --upgrade pip.
Andy
128

Utilisez pipupgrade !

$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes

pipupgrade vous aide à mettre à niveau votre système, local ou packages à partir d'un requirements.txtfichier! Il met également à niveau de manière sélective des packages qui ne cassent pas le changement. pipupgrade assure également la mise à niveau des packages présents dans plusieurs environnements Python. Compatible avec Python2.7 +, Python3.4 + et pip9 +, pip10 +, pip18 +, pip19 +.

entrez la description de l'image ici

REMARQUE: je suis l'auteur de l'outil.

Achilles Gasper Rasquinha
la source
1
Cette méthode a une sortie beaucoup plus propre que la réponse de @ rbp
Gaia
7
Belle idée, mais elle est bloquée pour Checking...toujours quand je l'ai essayée.
CGFoX
1
Je viens de l'installer et j'ai également bloqué la vérification[0;93mChecking...[0m
Chris
1
@nathandrake vous souhaitez ouvrir un problème sur la page des problèmes?
Achilles Gasper Rasquinha
2
Vous avez une erreur sur Windows 10 et Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
Qin Heyang
74

Vous pouvez simplement imprimer les packages obsolètes

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
janrito
la source
14
Dans un virtualenv, je le fais comme ceci:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Jeremy Blanchard
De nos jours, vous pouvez également le faire avec python -m pip list outdated(bien qu'il ne soit pas au format requis).
Jacktose
74

Cette option me semble plus simple et lisible:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

L'explication est que pip list --outdatedgénère une liste de tous les packages obsolètes dans ce format:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

Dans la commande awk, NR>2ignore les deux premiers enregistrements (lignes) et {print $1}sélectionne le premier mot de chaque ligne (comme suggéré par SergioAraujo, j'ai supprimé tail -n +3car il awkpeut en effet gérer les enregistrements ignorés ).

Marc
la source
Si une mise à niveau échoue, aucune des mises à niveau ne se produit.
Boris
2
vous pouvez éviter que la queue awk 'NR>2 {print $1}'nettoie la sortie pour vous
SergioAraujo
@SergioAraujo, cela rend la solution plus propre, merci pour l'astuce!
Marc
67

Le one-liner suivant pourrait s'avérer utile:

(pip> 20,0)

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

Versions plus anciennes:

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

xargs -n1 continue en cas d'erreur.

Si vous avez besoin d'un contrôle plus "fin" sur ce qui est omis et ce qui soulève une erreur, vous ne devez pas ajouter l' -n1indicateur et définir explicitement les erreurs à ignorer, en "canalisant" la ligne suivante pour chaque erreur distincte:

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

Voici un exemple de travail:

pip list --format freeze --outdated | sed 's/=.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U
raratiru
la source
J'ai dû ajouter des filtres pour les lignes commençant par "pourrait" et "certains" car apparemment pip envoie des avertissements à stdout :(
Chip Camden
OK, c'est juste: vous pouvez en ajouter autant | sed 's/^<First characters of the error>.*//'que nécessaire. Je vous remercie!
raratiru
14
Ou:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Jens
51

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.

Douglas Daseeco
la source
1
une autre façon de surmonter le BSD jurassique sedd'OS X est d'utiliser à la place gsed(GNU sed). Pour l'obtenir,brew install gnu-sed
Walter Tross
@WalterTross ... Jurassic ... bon usage de l'adjectif. Nous avons donc maintenant deux façons de grouper les packages pip de mise à jour avec une belle piste d'audit sur le terminal. (1) Utilisez l'option -E comme dans la réponse et (2) installez gsed pour quitter la période jurassique.
Douglas Daseeco
41

Cela semble plus concis.

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

Explication:

pip list --outdated obtient des lignes comme celles-ci

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

Dans cut -d ' ' -f1, -d ' 'définit "espace" comme délimiteur, -f1signifie obtenir la première colonne.

Ainsi, les lignes ci-dessus deviennent:

urllib3
wheel

puis passez-les à xargspour exécuter la commande pip install -U,, avec chaque ligne comme arguments ajoutés

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

Shihao Xu
la source
J'ai reçu cet avertissementDEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Reman
2
@Reman: c'est parce que vous utilisez Pip v9.0.1. Il s'agit simplement d'un message de dépréciation signifiant que certaines fonctionnalités ne survivront pas dans une future version de Pip. Rien à craindre;)
AlessioX
Cependant, cela doit être marqué comme la solution finale. En effet, la réponse acceptée se déroulera sur tous vos packages pip, ce qui est une perte de temps si vous ne devez mettre à jour que 1 ou 2 packages. Cette solution, au lieu de cela, fonctionnera un peu partout sur les packages obsolètes
AlessioX
34

J'ai eu le même problème avec la mise à niveau. Le fait est que je n'ai jamais mis à niveau tous les packages. Je ne mets à niveau que ce dont j'ai besoin, car le projet peut se casser.

Parce qu'il n'y avait pas de moyen facile de mettre à niveau package par package et de mettre à jour le fichier requirements.txt, j'ai écrit ce pip-upgrader qui met également à jour les versions de votre requirements.txtfichier pour les packages choisis (ou tous les packages).

Installation

pip install pip-upgrader

Usage

Activez votre virtualenv (important, car il installera également les nouvelles versions des packages mis à niveau dans virtualenv actuel).

cd dans le répertoire de votre projet, puis exécutez:

pip-upgrade

Utilisation avancée

Si 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 package vous souhaitez mettre à niveau, envoyez-les simplement comme arguments:

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

Si vous devez effectuer une mise à niveau vers la version pré-version / post-version, ajoutez un --prereleaseargument à votre commande.

Divulgation complète: j'ai écrit ce paquet.

Simion Agavriloaei
la source
8
C'est ce que pip devrait faire par défaut.
Nostalg.io
Attention à votre outil, certains échappements de caractères ne semblent pas fonctionner correctement sur ma machine Windows, mais à part ça, ça va
Luke
Je ne l'ai pas vraiment testé sur Windows, mais je vais installer une machine virtuelle. Merci
Simion Agavriloaei
Si virtualenvn'est pas activépip-upgrade --skip-virtualenv-check
Morse
2
Cela fonctionne également avec un dossier d'exigences ayant des exigences communes, dev et prod. Simplement génial!
cwhisperer
28

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

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

mais vous devez d'abord obtenir le jaune:

$ sudo pip install -U yolk
tkr
la source
1
Dernier commit il y a 7 ans
Boris
en l'an 2013 AD
dotbit
27

Version à une ligne 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()]'

"

Salman von Abbas
la source
4
subprocess.call ("sudo pip install ... au cas où vous auriez besoin d'autorisations
Maximiliano Rios
4
@MaximilianoRios Veuillez ne pas sudo pip installutiliser un environnement virtuel à la place.
Bengt
22

lorsque vous utilisez un virtualenv et si vous souhaitez simplement mettre à niveau les packages ajoutés à votre virtualenv, vous pouvez faire:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
brunobord
la source
19

La solution la plus simple et la plus rapide que j'ai trouvée dans la discussion sur le problème de pip est:

pip install pipdate
pipdate

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

RedEyed
la source
2
Alors que d'autres solutions ont calé en rencontrant la moindre anomalie, cette solution a averti puis ignoré le problème pour continuer avec les autres packages. Génial!
Serge Stroobandt
18

Solution Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
Apeirogon Prime
la source
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
Foad
2
Ce pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}serait peut -être plus approprié.
brainplot
16

utiliser des packs de mise à jour awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

mise à jour de Windows PowerShell foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

JohnDHH
la source
gel de pip | awk -F '[=]' '{print $ 1}' | xargs pip install -U
JohnDHH
Et pour python 3 ... pip3 install -U $ (pip3 freeze | awk -F '[=]' '{print $ 1}')
Jimmy MG Lim
12

Vous pouvez essayer ceci:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
何宗翰
la source
c'est la façon la plus claire et la plus lisible de mettre à jour les packages pip avec la plus grande brièveté. génial.
Mark Shust à M.academy
12

Le jaune plutôt é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.

user1175849
la source
3
Votre réponse a été changée de yolken yolk3k, votre réponse d'origine avait certainement des problèmes avec python3.
AXO
10

@ 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 site-packagesvérification exclut mes packages de développement, car ils ne se trouvent pas dans le répertoire système site-packages. L'essai sauf ignore simplement les packages qui ont été supprimés de PyPI.

@endolith: J'espérais aussi une solution facile pip.install(dist.key, upgrade=True), mais il ne semble pas que pip soit destiné à être utilisé par autre chose que la ligne de commande (les documents ne mentionnent pas l'API interne et les développeurs de pip n'ont pas utilisé docstrings).

chbrown
la source
Sur Ubuntu (et autres dérivés Debian), pipplace apparemment des paquets dans /usr/local/lib/python2.7/dist-packagesou similaire. Vous pouvez utiliser '/ usr / local / lib /' au lieu de 'site-packages' dans l' ifinstruction dans ce cas.
drevicko
10

Le pip_upgrade_outdatedfait le travail. Selon ses documents :

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

Étape 1:

pip install pip-upgrade-outdated

Étape 2:

pip_upgrade_outdated
adrin
la source
1
Étape 1: pip installer pip-upgrade-obsolète Étape 2: pip-upgrade-obsolète ... fait
shao.lo
9

Envoyé par une pull-request aux gens du pip ; en attendant, utilisez 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
Samuel Marks
la source
Version avec gestion des erreurs (selon le commentaire): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
Samuel marque le
9

Cela a semblé fonctionner pour moi ...

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

J'ai ensuite utilisé printfun espace pour séparer correctement les noms de package.

SaxDaddy
la source
7

Il s'agit d'une solution PowerShell pour Python 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

Et pour Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

Cela met à niveau les packages un par un. Donc un

pip3 check
pip2 check

ensuite, assurez-vous qu'aucune dépendance n'est rompue.

Nils Ballmann
la source
7

Que diriez-vous:

pip install -r <(pip freeze) --upgrade
user8598996
la source
7

Le plus court et le plus simple sous Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Ankireddy
la source
@Enkouyami sur windows 7 cette commande ne fonctionne pas sans -r. -r doit exclure le chemin d'accès au fichier d'exigences.
Chockomonkey
6

Mon script:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
Icyblade
la source
6

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 répertorie les packages obsolètes;
  2. grep -v -i warningcorrespondance inversée warningpour éviter les erreurs lors de la mise à jour
  3. cut -f1 -d1' ' renvoie le premier mot - le nom du package obsolète;
  4. tr "\n|\r" " "convertit le résultat multiligne de cuten une seule ligne, liste séparée par des espaces;
  5. awk '{if(NR>=3)print}' saute les lignes d'en-tête
  6. cut -d' ' -f1 récupère la première colonne
  7. xargs -n1 pip install -U prend 1 argument du tube à gauche de celui-ci et le passe à la commande pour mettre à niveau la liste des packages.
Alex V
la source
Voici ma sortie: kerberos iwlib PyYAML Could pygpgme Could Could Could ...Notez tous les "pourrait". Ceux-ci proviennent de la sortie de pip list -o"Impossible de trouver des téléchargements qui satisfont à l'exigence <package>"
DrStrangepork
Pouvez-vous coller la sortie de pip list -o?
Alex V
Les commentaires ne sont pas bien # pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
formatés
au lieu de filtrer toutes les lignes qui ne doivent pas être utilisés, je suggère de filtrer les lignes où existe une mise à jour: pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . Sinon, vous pourriez facilement manquer une ligne que vous ne voulez pas et obtenir le résultat mentionné par DrStrangeprk.
antibus
Je recommanderais fortement d'utiliser à la xargsplace. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UL' -rindicateur garantit qu'il pip install -Une sera pas exécuté s'il n'y a pas de packages obsolètes. L' -pindicateur invite l'utilisateur à confirmer avant d'exécuter une commande. Vous pouvez ajouter l' -n1indicateur pour qu'il vous soit demandé avant d'installer chaque package séparément.
Six
6

une ligne dans powershell 5.1 avec les droits adm, python 3.6.5 et pip ver 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

cela fonctionne bien s'il n'y a pas de colis cassés ou de roues spéciales dans la liste ...

Sébastien Wieckowski
la source