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.
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 ).
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)
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 .
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.
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
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:'
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
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 }'`
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
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
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.
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()]'
`
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.
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
Vous pouvez essayer ceci :
for i in ` pip list|awk -F ' ' '{print }'`;do pip install --upgrade $i;done
Windows Powershell solution
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
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.
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
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.
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).
mon script:
pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
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
-
pip list -o
liste les colis périmés; -
grep -v -i warning
correspondance inversée surwarning
pour éviter les erreurs lors de la mise à jour -
cut -f1 -d1' '
renvoie le premier mot - le nom du paquet périmé; -
tr "\n|\r" " "
convertit le résultat multiligne decut
en une seule ligne, séparée par des espaces; -
awk '{if(NR>=3)print}'
saute des lignes d'en-tête -
cut -d' ' -f1
va chercher la première colonne -
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.
Que Diriez-vous de:
pip install -r <(pip freeze) --upgrade
utiliser awk update packges:
pip install -U $(pip freeze | awk -F'[=]' '{print }')
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:
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)
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])
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)
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 ...