Comment puis-je mettre à niveau des packages spécifiques à l'aide de pip et d'un fichier d'exigences?

437

J'utilise pip avec un fichier d'exigences, dans un virtualenv, pour mes projets Django. J'essaie de mettre à niveau certains packages, notamment Django lui-même, et j'obtiens une erreur concernant les conflits de code source:

Source in `<virtualenv`>/build/Django has version 1.2.3 that conflicts with Django==1.2.4 (from -r requirements/apps.txt (line 3))

C'est après avoir mis à jour le numéro de version de Django de 1.2.3 à 1.2.4 dans mon fichier d'exigences. J'utilise cette commande pour faire la mise à niveau:

pip --install --upgrade -E `<virtualenv dir`> --requirement `<requirements file`>

Je ne trouve aucun indicateur qui déclenche un re-téléchargement total du package. J'ai même essayé d'exécuter une commande de désinstallation d'abord, puis l'installation, mais pas de dés. Peut-être que je manque quelque chose?

gcaprio
la source
1
Veuillez vérifier la réponse de @ dr-jimbob car les versions récentes de pip mettront à jour toutes les autres dépendances dont dépend le package que vous mettez à niveau.
Lokesh Meher, le

Réponses:

61

Je ne sais pas si c'est exactement votre problème, mais dans mon cas, je n'ai pas pu mettre à niveau Django vers 1.2.4 - je terminais toujours avec la version 1.2.3, j'ai donc désinstallé Django avec:

<virtualenv>/bin/pip uninstall Django

Ensuite, j'ai supprimé le <virtualenv>/build/Djangorépertoire et enfin j'ai installé la bonne version avec:

<virtualenv>/bin/pip install Django

J'espère que cela vous aidera.

Marcin Świerczyński
la source
53
Ce n'est pas la meilleure pratique. Utilisez pip install Django -Uou pip install Django --upgradecomme décrit dans la réponse de @JoeyG.
Ahmad
@Ahmad est d'accord. Il devrait y avoir un processus de mise à jour fluide dans pip et env virtuel.
Parth Joshi
1274

J'ai exécuté la commande suivante et elle est passée de 1.2.3 à 1.4.0

pip install Django --upgrade

Raccourci pour la mise à niveau:

pip install Django -U

Remarque : si le package que vous mettez à niveau a des exigences, cette commande mettra également à niveau toutes les exigences vers les dernières versions disponibles. Dans les versions récentes de pip, vous pouvez empêcher ce comportement en spécifiant--upgrade-strategy only-if-needed . Avec cet indicateur, les dépendances ne seront pas mises à niveau sauf si les versions installées des packages dépendants ne satisfont plus aux exigences du package mis à niveau.

JoeyG
la source
7
Pour moi, cela a mis à jour tous mes emballés et tout foiré !!!! Les documents indiquent: - mettre à niveau tous les packages vers la dernière version disponible. Est-ce correct ou ai-je fait quelque chose de mal?
Prometheus
4
@OrbiterFleet J'avais besoin de mettre à jour les "demandes", donc je l'ai fait pip install Requests --upgradeet seules les "demandes" ont été mises à niveau. La description indique "mettre à niveau tous les packages spécifiés " lorsque je consulte les documents.
harperville
31
ATTENTION, il met également à jour toutes les dépendances et peut tout gâcher. la meilleure option consiste à désinstaller et réinstaller le package.
marcelosalloum
3
pour mettre à niveau l'utilisation d'un package spécifiquepip install --upgrade django==1.4.0
whale_steward
cela devrait être la bonne réponse selon la question ou la question elle-même est fausse.
int soumen
51

selon pip docs exemple 3

pip install --upgrade django

mais sur la base de mon expérience, l'utilisation de cette méthode mettra également à niveau tout package s'y rapportant. exemple:

Supposons que vous souhaitiez effectuer une mise à niveau somepackagenécessitant l' django >= 1.2.4utilisation de ce type de méthode, il mettra également à niveau somepackageET djangovers la dernière mise à jour. Juste pour être sûr, faites:

# assume you want to keep django 1.2.4
pip install --upgrade somepackage django==1.2.4

Faire cela mettra à jour somepackageet gardera Django à la version 1.2.4

whale_steward
la source
Bonne prise mais votre explication est déroutante puisque vous avez commencé avec djangocomme package principal puis dans l'exemple que vous utilisez somepackagepuis utilisez djangocomme dépendance.
Long
34

La commande de raccourci pour --upgrade:

pip install Django --upgrade

Est:

pip install Django -U
Aaron Lelevier
la source
7
Que diriez-vous de modifier la réponse existante pour ajouter ce peu d'informations au lieu d'une réponse (incomplète)?
a1an
@ a1an, veuillez suggérer les informations supplémentaires qui, selon vous, devraient être ajoutées dans une "modification suggérée". Merci
Aaron Lelevier
4
Je veux dire que vous pouvez modifier la réponse donnée par JoeyG, en ajoutant l'option de raccourci que vous avez fournie dans son contexte.
a1an
17

Si vous mettez à niveau un package, l'ancien sera désinstallé.

Un moyen pratique de le faire consiste à utiliser cette pip-upgrader qui met également à jour les versions dans votrerequirements.txt fichier 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 mettre à niveau vers la version pré-version / post-version, ajoutez un --prereleaseargument à votre commande.

Divulgation complète: j'ai écrit ce paquet. J'espère que cela aide.

Simion Agavriloaei
la source
1
existe-t-il une option pour mettre à niveau tous les packages à la fois (c'est-à-dire sans les répertorier) avec cette approche?
Fan numéro un de Bjorks
1
@MikePalmice yes: pip-upgrade -p allmettra à niveau tous vos packages et mettra à jour le fichier des exigences sans avoir besoin de votre part.
Simion Agavriloaei
16

Si vous souhaitez uniquement mettre à niveau un package spécifique appelé somepackage, la commande que vous devez utiliser dans les versions récentes de pip est

pip install --upgrade --upgrade-strategy only-if-needed somepackage

Ceci est très utile lorsque vous avez développé une application dans django qui ne fonctionne actuellement qu'avec une version spécifique de django (disons Django = 1.9.x) et que vous souhaitez mettre à niveau un package dépendant avec une correction de bogue / nouvelle fonctionnalité et que le package mis à niveau dépend sur django (mais fonctionne avec disons n'importe quelle version de django après 1.5). Le comportement par défaut de pip install --upgrade django-some-packageserait de mettre à niveau django vers la dernière version disponible qui pourrait autrement casser votre application, bien qu'avec les --upgrade-strategy only-if-neededpackages dépendants, la mise à niveau ne sera désormais que nécessaire.

dr jimbob
la source
4

Normalement, pip nettoiera après lui-même et supprimera le contenu du répertoire de construction. La seule fois où il ne le fait pas, c'est:

  1. Vous avez utilisé le --no-install option
  2. Vous utilisez des packages modifiables
  3. L'installation a été annulée ou a été interrompue d'une autre manière.

Dans tous les autres cas, vous ne devriez pas avoir de buildrépertoire qui obstrue votre environnement.

Burhan Khalid
la source
1

La définition d'une version spécifique à mettre à niveau m'a aidé au lieu de la seule commande de mise à niveau.

pip3 install larapy-installer==0.4.01 -U
Bedram Tamang
la source
0

qui a résolu pour moi le problème "pip install -I --upgrade psutil --force" après, désinstallez simplement psutil avec la nouvelle version et hop vous pouvez installer soudainement l'ancienne version (:

Eran Hpac
la source
0

J'utilise ceci:

pip3 install -r  requirements.txt  
Shahab Rahnama
la source