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.

Était-ce utile?

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.

version de Windows après avoir consulté un excellent FOR par Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i

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.

 entrer image description ici

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

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

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 
  1. Listes de pip list -o paquets obsolètes;
  2. grep -v -i warning correspondance inversée sur warning à des erreurs d'éviter lors de la mise à jour
  3. cut -f1 -d1' ' retourne le premier mot - le nom du paquet obsolète;
  4. tr "\n|\r" " " convertit le résultat multiligne de cut en une seule ligne, liste séparée par des espaces;
  5. awk '{if(NR>=3)print}' lignes tête saute
  6. cut -d' ' -f1 va chercher la première colonne
  7. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top