Comment mettre à jour tous les paquets Python avec pip?
Question
Est-il possible de mettre à niveau tous les paquets Python à un moment donné avec pip
?
Remarque : qu'il ya de demande de fonctionnalité pour ceci sur le tracker d'émission officielle.
La solution
Il n'y a pas encore intégré drapeau, 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 infinies variations possibles pour cela. J'essaie de garder cette réponse courte et simple, mais s'il vous plaît ne suggérer des variations dans les commentaires!
Dans une version plus ancienne de pip
, vous pouvez utiliser ceci:
pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
Le grep
est de sauter modifiables ( « -E ») des définitions de paquet, tel que suggéré par @jawache. (Oui, vous pouvez remplacer grep
+ cut
avec sed
ou awk
ou perl
ou ...).
Le drapeau -n1
pour xargs
empêche tout arrêter si la mise à jour d'un paquet échoue (merci @andsens ).
Autres conseils
Vous pouvez utiliser le code Python suivant. Contrairement à pip freeze
, ce ne sera pas imprimer 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 à niveau tous les paquets locaux; vous pouvez utiliser pip-review
:
$ pip install pip-review
$ pip-review --local --interactive
pip-review
est une fourche de pip-tools
. Voir pip-tools
mentionné par @ knedlsepp . travaux de package pip-review
mais package 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 le répertoire que vous êtes, en invite de commande, par exemple C:.. / Utilisateurs / Nom d'utilisateur>)
faire
$ pip freeze > requirements.txt
ouvrir le fichier texte, remplacez le ==
avec >=
, et exécuter
$ pip install -r requirements.txt --upgrade
Si vous avez un problème avec un certain paquet caler la mise à niveau (numpy parfois), allez dans le répertoire ($), commentez le nom (ajouter un # avant lui) et exécuter la mise à niveau. Vous pouvez ensuite décommentez section arrière. Ceci est également idéal pour la copie des environnements globaux python.
Une autre façon:
Je 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 paquets; si une mise à jour échoue, exécutez-le à nouveau et il se poursuit à la suivante.
Utilisez pipupgrade !
$ pip install pipupgrade
$ pipupgrade --latest --yes
pipupgrade vous permet de mettre à jour votre système, local ou paquets à partir d'un fichier requirements.txt
! Il met également à niveau de manière sélective les paquets qui ne cassent pas le changement. pipupgrade assure également la mise à niveau des paquets présents dans de nombreux environnements Python. Compatible avec python2.7 +, + Python3.4 et pip9 +, pip10 +, pip18 +, + pip19.
NOTE:. Je suis l'auteur de l'outil
Vous pouvez juste imprimer les paquets qui sont obsolètes
pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
La seule ligne suivante pourrait se révéler d'une aide:
pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U
xargs -n1
continue à aller si une erreur se produit.
Si vous avez besoin de plus « à grains fins » contrôle sur ce qui est omis et ce qui déclenche une erreur que vous ne devez pas ajouter le drapeau -n1
et définir explicitement les erreurs à ne pas tenir compte, par « tuyauterie » la ligne suivante pour chaque erreur séparée:
| 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
Cette option me semble plus simple et lisible:
pip install -U `pip list --outdated | tail -n +3 | awk '{print $1}'`
L'explication est que pip list --outdated
produit une liste de tous les paquets 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
tail -n +3
saute les deux premières lignes et awk '{print $1}'
sélectionne le premier mot de chaque ligne.
Plus Solution robuste
Pour PIP3 utiliser ceci:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Pour pip, supprimez les 3s en tant que tel:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
Mac OS X Oddity
Mac OS X, à partir de Juillet 2017, livré avec une version très ancienne de sed (une douzaine) ans. Pour obtenir les expressions régulières, l'utilisation -E au lieu de -r dans la solution ci-dessus.
Résolution des problèmes avec les solutions populaires
Cette solution est bien conçu et testé 1 , alors qu'il ya des problèmes avec même des solutions les plus populaires.
- Problèmes de portabilité en raison de fonctionnalités de changement de ligne de commande pip
- Crashing de xargs parce que les échecs de processus enfant pip commun ou PIP3
- journalisation bondé de la sortie xargs brut
- En se fondant sur un pont Python à OS tout en pouvant le mettre à niveau 3
La commande ci-dessus utilise la syntaxe pip plus simple et portable en combinaison avec sed et sh pour surmonter ces problèmes complètement. Les détails de l'opération sed peuvent être passés au crible 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 saveurs Linux / Unix. Il fonctionne également sur Cygwin64 installé sur Windows 10. Test sur iOS est nécessaire.
[2] Pour voir l'anatomie de la commande plus clairement, cela est l'équivalent exact de la commande ci-dessus avec des commentaires PIP3:
# 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] 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 corruption de la base de données impasse ou package.
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]
En cut -d ' ' -f1
, jeux de -d ' '
« espace » comme séparateur, des moyens de -f1
pour obtenir la première colonne.
Ainsi, les lignes ci-dessus devient:
urllib3
wheel
les transmettre ensuite à xargs
pour exécuter la commande, pip install -U
, chaque ligne en ajoutant arguments
-n1
limite le nombre d'arguments passés à chaque commande pip install -U
soit 1
J'ai eu le même problème avec la mise à niveau. La chose est, je mets à jour tous les paquets jamais. Je mets à jour seulement ce que je dois, parce que projet peut se briser.
Parce qu'il n'y avait aucun moyen facile pour package de mise à niveau par paquet, et mettre à jour le fichier requirements.txt, je l'ai écrit cette pip-upgrader qui met aussi à jour les versions de votre fichier requirements.txt
pour les paquets choisis (ou tous les paquets).
Installation
pip install pip-upgrader
Utilisation
Activer votre virtualenv (important, car il installera également les nouvelles versions des paquets mis à jour dans virtualenv en cours).
cd
dans votre répertoire de projet, puis exécutez:
pip-upgrade
Utilisation avancée
Si les exigences sont placées dans un endroit non standard, les envoyer comme arguments:
pip-upgrade path/to/requirements.txt
Si vous savez déjà ce paquet que vous souhaitez mettre à jour, envoyez simplement comme arguments:
pip-upgrade -p django -p celery -p dateutil
Si vous devez passer à une pré-version / version post-libération, ajouter argument --prerelease
à votre commande.
La divulgation complète. J'ai écrit ce paquet
De https://github.com/cakebread/yolk :
$ pip install -U `yolk -U | awk '{print $1}' | uniq`
Cependant, vous devez obtenir le jaune d'abord:
$ sudo pip install -U yolk
Version One-liner de @ Ramana de réponse.
python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'
`
lorsque vous utilisez un virtualenv et si vous voulez juste de mettre à jour des paquets ajouté à votre virtualenv, vous pouvez faire:
pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
Solution de Windows Powershell
pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
La solution la plus simple et la plus rapide que j'ai trouvé dans le numéro pip discussion est:
sudo -H pip install pipdate
sudo -H pipdate
Vous pouvez essayer ceci:
for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
Le jaune assez étonnant en fait 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/ jaune / 0.4.3
Il peut faire beaucoup de choses que vous trouverez probablement utile.
mise à jour l'utilisation de awk packges:
pip install -U $(pip freeze | awk -F'[=]' '{print $1}')
Mise à jour Windows PowerShell
foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}
@ réponse de Ramana fonctionne le mieux pour moi, de ceux qui sont ici, mais je devais ajouter quelques prises:
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
Le chèque site-packages
exclut mes paquets de développement, parce qu'ils ne sont pas situés dans le répertoire système site-packages. Le try-except permet de sauter simplement les paquets qui ont été retirés de PyPI.
@endolith: J'espérais un pip.install(dist.key, upgrade=True)
facile aussi, mais il ne ressemble pas à pip était censé être utilisé par quoi que ce soit, mais la ligne de commande (les docs ne mentionnent pas l'API interne, et les développeurs de pépin ne pas utiliser docstrings).
Envoyé par un pull-demande au peuple de pépin ; dans l'utilisation attendant cette solution de bibliothèque de pépin, 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 semblait fonctionner pour moi ...
pip install -U $(pip list --outdated|awk '{printf $1" "}')
J'utilisé printf
avec un espace après pour séparer correctement les noms de paquets.
Le plus court et plus facile sur Windows.
pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
Mon script:
pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
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
- Listes de
pip list -o
paquets obsolètes; -
grep -v -i warning
correspondance inversée surwarning
à des erreurs d'éviter lors de la mise à jour -
cut -f1 -d1' '
retourne le premier mot - le nom du paquet obsolète; -
tr "\n|\r" " "
convertit le résultat multiligne decut
en une seule ligne, liste séparée par des espaces; -
awk '{if(NR>=3)print}'
lignes tête saute -
cut -d' ' -f1
va chercher la première colonne -
xargs -n1 pip install -U
prend 1 argument de la conduite à gauche de celui-ci, et il passe à la commande pour mettre à jour la liste des paquets.
Ceci est 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] }
met à niveau les paquets un par un. Ainsi, un
pip3 check
pip2 check
après doivent se assurer aucune dépendance sont brisés.
Que diriez-vous:
pip install -r <(pip freeze) --upgrade
Le pip_upgrade_outdated
fait le travail. Selon son docs :
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
Etape 1:
pip install pip-upgrade-outdated
Étape 2:
pip_upgrade_outdated
import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
pip.main(['install', '--upgrade', pkg])
ou même:
import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)
fonctionne rapidement car il ne se lance pas constamment une coquille. J'aimerais trouver le temps pour obtenir ce réellement utiliser la liste obsolète pour accélérer les choses encore plus.