Mettre à niveau les packages python à partir de requirements.txt à l'aide de la commande pip

113

Comment mettre à niveau tous mes packages python à partir du fichier requirements.txt à l'aide de la commande pip?

essayé avec la commande ci-dessous

$ pip install --upgrade -r requirements.txt

Depuis, les packages python portent le suffixe du numéro de version ( Django==1.5.1) qu'ils ne semblent pas mettre à niveau. Existe-t-il une meilleure approche que la modification manuelle du fichier requirements.txt?

ÉDITER

Comme Andy l'a mentionné dans ses réponses, les packages sont épinglés à une version spécifique, il n'est donc pas possible de mettre à niveau les packages via la commande pip.

Mais nous pouvons y parvenir en pip-toolsutilisant la commande suivante.

$ pip-review --auto

cela mettra automatiquement à jour tous les packages de requirements.txt (assurez-vous d'installer à l' pip-toolsaide de la commande pip install).

abhiomkar
la source
7
Pip-tools fonctionne très bien - la syntaxe mise à jour l'est pip-compile -U requirements.txt.
erikreed le

Réponses:

40

Non. Votre fichier d'exigences a été épinglé à des versions spécifiques. Si vos exigences sont définies sur cette version, vous ne devez pas essayer de mettre à niveau au-delà de ces versions. Si vous devez effectuer une mise à niveau, vous devez passer aux versions non épinglées dans votre fichier d'exigences.

Exemple:

lxml>=2.2.0

Cela mettrait à niveau lxml vers n'importe quelle version plus récente que 2.2.0

lxml>=2.2.0,<2.3.0

Cela mettrait à jour lxml vers la version la plus récente entre 2.2.0 et 2.3.0.

Andy
la source
2
J'ai trouvé utile de faire ce qui suit. 1. Supprimé venv 2. Créé un nouveau avec le même nom (la façon de nettoyer tous les paquets pip) 3. Remplacez tous == par> = dans le requirements.txt 4. pip install -r requirements.txt 4.
zhukovgreen
sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt remplacera tout ==par>=
philshem
80

tu peux essayer:

pip install --upgrade --force-reinstall -r requirements.txt

Vous pouvez également ignorer le package installé et installer le nouveau:

pip install --ignore-installed -r requirements.txt
Pigiste
la source
2
avec cette option, il semble réinstaller la même version. Comme Andy l'a mentionné dans la réponse ci-dessus, les packages sont épinglés à une version spécifique.
abhiomkar
@abhiomkar you're rigth Je pensais que vous vouliez réinstaller la même version (peut-être pour ajouter un correctif de backport)
Freelancer
1
La deuxième commande est ce que je cherchais. Notez que -Iet --ignore-installedsont les mêmes drapeaux et de plats ce n'est pas valable d'avoir un ,là - dedans. De cette façon, aucune rétrogradation ne se produira pendant l'installation et une fois l'installation des exigences terminée, vous pouvez mettre à niveau les packages installés à l'aide de pip-review --auto.
AXO
79

J'ai déjà répondu à cette question ici . Voici ma solution:

Comme il n'y avait pas de moyen facile de mettre à niveau un 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.txtfichier 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 votre répertoire de projet, puis exécutez:

pip-upgrade

Utilisation avancée

Si les exigences sont placées dans un emplacement non standard, envoyez-les en tant qu'arguments:

pip-upgrade path/to/requirements.txt

Si vous savez déjà quel package vous souhaitez mettre à niveau, envoyez-les simplement en tant qu'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.

Simion Agavriloaei
la source
5
Génial! Il est surprenant qu'une telle fonction ne soit pas présente directement dans pip
Jacopofar
5
Élégant! Super-content d'avoir fait défiler jusqu'à ceci: P
PulseJet
3
Je viens de l'utiliser, et c'est la meilleure chose depuis les f-strings.
Pierre.Sassoulas
1
Excellent outil. Je vous remercie.
mszaro
Outil très utile! J'ai également trouvé un autre package appelé pur qui met également à niveau les versions épinglées
Gal Avineri
4

Je suggère de geler toutes vos dépendances afin d'avoir des builds prévisibles .

En faisant cela, vous pouvez mettre à jour toutes les dépendances à la fois comme ceci:

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

Après avoir fait ce qui précède, testez votre projet avec le nouvel ensemble de packages et validez éventuellement le requirements.txtfichier dans le référentiel.

Hermès
la source
3

J'ai juste dû faire la même chose ... j'ai utilisé ce petit monoplace pour faire le travail:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

lequel:

  • packages=$(cat requirements.txt | sed 's/==.*//g') crée une liste des noms de packages actuels dans requirements.txt (en supprimant la version).
  • echo $packages | xargs pip3 install -U passe ensuite tous les packages comme arguments à pip3 pour la mise à niveau.
  • freeze=$(pip3 freeze); Obtient toutes les versions actuelles du package au format requis pour requirements.txt
  • for p in $(echo $packages) puis parcourt les noms des packages
    • echo $freeze | grep -E "^${p}==" >> requirements.new obtient la ligne de version du package à partir de la sortie pip freeze qui correspond au package et écrit dans new requirements.txt

Cela présente l'avantage supplémentaire de préserver l'ordre du fichier requirements.txt d'origine. :)

J'espère que cela t'aides!

MatthewJohn
la source
2

Comme je ne pouvais pas faire cela avec bash, j'ai écrit un module python pour créer un nouveau fichier d'exigences sans version et l'utiliser:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

Ensuite, installez les bibliothèques à partir du nouveau fichier pip install -U -r requirements-prod-no-version.pip

Enfin, figer les versions dans le fichier d'origine pip freeze > requirements-prod.pip

Montaro
la source
2

Une autre solution consiste à utiliser le package upgrade-requirements

pip install upgrade-requirements

Et puis exécutez:

upgrade-requirements

Il mettra à niveau tous les packages qui ne sont pas à leur dernière version, et créera également un requirements.txt mis à jour à la fin.

dmdip
la source
0
  • 1) Pour mettre à jour les fichiers installés pip depuis reqs.txt, ajoutez le > = en remplacement de == cela indiquera à pip d'installer la lib supérieure ou égale à la version que vous demandez, ici en installant la version la plus récente de la bibliothèque demandée

    1.a) ** Ma réponse pour le fil ** En ajoutant py -m pip install -r reqs.txt à un redémarrage quotidien ... ou quelque chose de ce genre, vous pouvez mettre à jour vos bibliothèques installées. Résumé par Andy parfaitement

    -Ma raison pour entrer dans ce fil était de trouver des informations sur la façon de mettre à jour le pip de base d'environnement virtuel (généralement 10.0.03 pour moi ??)

dans l'espoir de satisfaire un problème dont j'ai pu trouver l'une des deux solutions

A. création de venv || B. Installation des bibliothèques requises

Grâce à Andy, j'ai satisfait le besoin B

En ajoutant pip > = version demandée dans reqs.txt

lors de l'instanciation d'un nouvel environnement virtuel || ré-instanciation du Venv précédent

  1. py -m venv devenv

pour configurer un nouvel environnement de développement

  1. evenv\scripts\activate.bat

pour activer dev env

  1. python -m pip install -r requirenments.txt

pour installer les bibliothèques de base

sortie yeilds

Collecte de pip > = 20.0.2 (à partir de -r requitenments.txt (ligne 1)) Utilisation de cached> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py2.py none-any.whl

Installation existante trouvée: pip 10.0.1

Désinstallation de pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Désolé pour le Brain Dump, j'espère que cela aide quelqu'un :)

🤳 Austin 👨‍🎤🚀🥊

Austin Atherton
la source
0

La deuxième réponse est la plus utile mais ce que je voulais faire, c'est verrouiller certains paquets tout en en ayant d'autres à la dernière version (par exemple youtube-dl).

Un exemple requirements.txtressemblerait à ceci (~ signifie compatible):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Puis dans le terminal, utilisez la commande pip install --upgrade -r requirements.txt

Cela garantit que Pillow restera à 6.2.2, les demandes seront mises à niveau vers la dernière version 2.22.x (si disponible) et la dernière version de youtube-dl sera installée si ce n'est déjà fait.

Eli
la source
0

Je suppose que la solution la plus simple consiste à créer le requirements.txt avec:

pip freeze | sed 's/==/>=/' > requirements.txt
Gumwon Hong
la source
-1

Si vous installez quelque chose dans votre projet django et après l'installation, vous souhaitez mettre à jour votre fichier d'exigences, cette commande peut mettre à jour votre fichier exigence.txt pip freeze> requirements.txt

si votre fichier d'exigences n'existe pas dans votre projet, vous pouvez utiliser cette commande pour créer un nouveau fichier requis.txt pip freeze> requirements.txt

Gaurav Mandhotra
la source
c'est une mauvaise idée car cela ajoutera également les exigences de toutes vos exigences, ce qui entraînera un fichier d'exigences inutilement volumineux. Si vous décidez ensuite de mettre à jour une seule dépendance, vous risquez d'obtenir des conflits de version, à moins que vous ne sachiez quelles autres exigences ont été ajoutées à votre fichier d'exigences en raison de ce package.
émeute
-10

J'édite le requirements.txt comme ci-dessous et lance $ sh ./requirements.txt

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;
Santhosh Yedidi
la source
3
C'est l'exemple idéal de l'anti-motif. Quel est le problème ici: 1) Le fichier requirements.txt est un fichier .txt, mais vous l'avez rendu exécutable 2). Il existe une simple commande pip install -r requirements.txt. Vous ne pouvez donc utiliser le fichier requirements.txt que pour lister les dépendances de votre projet. 3) Vous n'utilisez pas de versions des packages. 4) Pas un modèle commun, les autres développeurs ne savent pas comment l'utiliser. 5) Difficile à utiliser avec les pipelines CI / CD. Veuillez ne pas utiliser cet exemple
Fannigurt