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.
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.
pip freeze
(commebundle install
ounpm shrinkwrap
). Mieux vaut en sauvegarder une copie avant de bricoler.pip
installation, lors de la mise à niveaurequests
. Le message d'erreur estcannot import name IncompleteRead
.Réponses:
Il n'y a pas encore d'indicateur intégré, mais vous pouvez utiliser
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:La fonction
grep
consiste à ignorer les définitions de packages modifiables ("-e"), comme suggéré par @jawache. (Oui, vous pouvez remplacergrep
+cut
parsed
ouawk
ouperl
ou ...).L'
-n1
indicateur pourxargs
empêche tout arrêter si la mise à jour d'un package échoue (merci @andsens ).la source
pip install -U
, il mettra à jour tous les packages. J'ai peur que cela puisse provoquer des conflits avec apt-get.tee
avant de faire la mise à niveau réelle afin que vous puissiez obtenir une liste des versions originales. Par exemplepip freeze --local | tee before_upgrade.txt | ...
, il serait plus facile de revenir en arrière en cas de problème.-H
poursudo
éviter un message d'erreur ennuyeux:$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Vous pouvez utiliser le code Python suivant. Contrairement à
pip freeze
cela, cela n'imprimera pas les avertissements et les erreurs FIXME. Pour pip <10.0.1Pour pip> = 10.0.1
la source
import pip
pip.install('packagename')
?Pour mettre à niveau tous les packages locaux; vous pourriez utiliser
pip-review
:pip-review
est une fourchette depip-tools
. Voir lepip-tools
problème mentionné par @knedlsepp .pip-review
le package fonctionne mais lepip-tools
package ne fonctionne plus.pip-review
fonctionne sur Windows depuis la version 0.5 .la source
pip-review --local --auto
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
ouvrez le fichier texte, remplacez le
==
par>=
et exécutezSi 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:
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.
la source
requirements.txt
« s=={version}
. Par exemple:python-dateutil==2.4.2
àpython-dateutil
pour toutes les lignes.$ pip freeze | cut -d '=' -f1> requirements.txt
afin de supprimer la versionpip3 install -r <(pip3 freeze) --upgrade
Effectivement,<(pip3 freeze)
est un canal anonyme, mais il agira comme un objet fichierVersion Windows après avoir consulté une excellente documentation pour
FOR
par Rob van der Woudela source
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"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%%i
place de%i
. Notez également qu'il est plus propre de mettre à jourpip
avant d'exécuter cette commande à l'aide depython -m pip install --upgrade pip
.Utilisez pipupgrade !
pipupgrade vous aide à mettre à niveau votre système, local ou packages à partir d'un
requirements.txt
fichier! 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 +.REMARQUE: je suis l'auteur de l'outil.
la source
Checking...
toujours quand je l'ai essayée.[0;93mChecking...[0m
ModuleNotFoundError: No module named 'ctypes.windll'
Vous pouvez simplement imprimer les packages obsolètes
la source
pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
python -m pip list outdated
(bien qu'il ne soit pas au format requis).Cette option me semble plus simple et lisible:
L'explication est que
pip list --outdated
génère une liste de tous les packages obsolètes dans ce format:Dans la commande awk,
NR>2
ignore 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 +3
car ilawk
peut en effet gérer les enregistrements ignorés ).la source
awk 'NR>2 {print $1}'
nettoie la sortie pour vousLe one-liner suivant pourrait s'avérer utile:
(pip> 20,0)
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'
-n1
indicateur 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:
la source
| sed 's/^<First characters of the error>.*//'
que nécessaire. Je vous remercie!pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Solution plus robuste
Pour pip3, utilisez ceci:
Pour pip, il suffit de retirer les 3 comme tels:
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.
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:
[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.
la source
sed
d'OS X est d'utiliser à la placegsed
(GNU sed). Pour l'obtenir,brew install gnu-sed
Cela semble plus concis.
Explication:
pip list --outdated
obtient des lignes comme celles-ciDans
cut -d ' ' -f1
,-d ' '
définit "espace" comme délimiteur,-f1
signifie obtenir la première colonne.Ainsi, les lignes ci-dessus deviennent:
puis passez-les à
xargs
pour exécuter la commandepip install -U
,, avec chaque ligne comme arguments ajoutés-n1
limite le nombre d'arguments passés à chaque commandepip install -U
à 1la source
DEPRECATION: 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.
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.txt
fichier pour les packages choisis (ou tous les packages).Installation
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:Utilisation avancée
Si les exigences sont placées dans un emplacement non standard, envoyez-les comme arguments:
Si vous savez déjà quel package vous souhaitez mettre à niveau, envoyez-les simplement comme arguments:
Si vous devez effectuer une mise à niveau vers la version pré-version / post-version, ajoutez un
--prerelease
argument à votre commande.Divulgation complète: j'ai écrit ce paquet.
la source
virtualenv
n'est pas activépip-upgrade --skip-virtualenv-check
Depuis https://github.com/cakebread/yolk :
mais vous devez d'abord obtenir le jaune:
la source
Version à une ligne de la réponse de @ Ramana .
"
la source
sudo pip install
utiliser un environnement virtuel à la place.lorsque vous utilisez un virtualenv et si vous souhaitez simplement mettre à niveau les packages ajoutés à votre virtualenv, vous pouvez faire:
la source
La solution la plus simple et la plus rapide que j'ai trouvée dans la discussion sur le problème de pip est:
Source: https://github.com/pypa/pip/issues/3819
la source
Solution Windows Powershell
la source
pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}
?pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
serait peut -être plus approprié.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]}
la source
Vous pouvez essayer ceci:
la source
Le jaune plutôt étonnant rend cela facile.
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.
la source
yolk
enyolk3k
, votre réponse d'origine avait certainement des problèmes avec python3.@ La réponse de Ramana a fonctionné le mieux pour moi, de ceux ici, mais j'ai dû ajouter quelques captures:
La
site-packages
vé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).la source
pip
place apparemment des paquets dans/usr/local/lib/python2.7/dist-packages
ou similaire. Vous pouvez utiliser '/ usr / local / lib /' au lieu de 'site-packages' dans l'if
instruction dans ce cas.Le
pip_upgrade_outdated
fait le travail. Selon ses documents :Étape 1:
Étape 2:
la source
Envoyé par une pull-request aux gens du pip ; en attendant, utilisez cette solution de bibliothèque pip, j'ai écrit:
la source
Cela a semblé fonctionner pour moi ...
J'ai ensuite utilisé
printf
un espace pour séparer correctement les noms de package.la source
Il s'agit d'une solution PowerShell pour Python 3:
Et pour Python 2:
Cela met à niveau les packages un par un. Donc un
ensuite, assurez-vous qu'aucune dépendance n'est rompue.
la source
Que diriez-vous:
la source
Le plus court et le plus simple sous Windows.
la source
Mon script:
la source
N'est-ce pas plus efficace?
pip list -o
répertorie les packages obsolètes;grep -v -i warning
correspondance inverséewarning
pour éviter les erreurs lors de la mise à jourcut -f1 -d1' '
renvoie le premier mot - le nom du package 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}'
saute les lignes d'en-têtecut -d' ' -f1
récupère la première colonnexargs -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.la source
kerberos iwlib PyYAML Could pygpgme Could Could Could ...
Notez tous les "pourrait". Ceux-ci proviennent de la sortie depip list -o
"Impossible de trouver des téléchargements qui satisfont à l'exigence <package>"pip list -o
?# 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;
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.xargs
place.pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -U
L'-r
indicateur garantit qu'ilpip install -U
ne sera pas exécuté s'il n'y a pas de packages obsolètes. L'-p
indicateur invite l'utilisateur à confirmer avant d'exécuter une commande. Vous pouvez ajouter l'-n1
indicateur pour qu'il vous soit demandé avant d'installer chaque package séparément.une ligne dans powershell 5.1 avec les droits adm, python 3.6.5 et pip ver 10.0.1:
cela fonctionne bien s'il n'y a pas de colis cassés ou de roues spéciales dans la liste ...
la source