Aggiorna i pacchetti python da requirements.txt utilizzando il comando pip


113

Come aggiorno tutti i miei pacchetti python dal file requirements.txt usando il comando pip?

provato con il comando sottostante

$ pip install --upgrade -r requirements.txt

Poiché, i pacchetti python hanno il suffisso con il numero di versione ( Django==1.5.1), non sembrano aggiornarsi. Esiste un approccio migliore rispetto alla modifica manuale del file requirements.txt?

MODIFICARE

Come ha accennato Andy nella sua risposta, i pacchetti sono bloccati a una versione specifica, quindi non è possibile aggiornare i pacchetti tramite il comando pip.

Ma possiamo ottenere ciò pip-toolsutilizzando il seguente comando.

$ pip-review --auto

questo aggiornerà automaticamente tutti i pacchetti da requirements.txt (assicurati di installare pip-toolsusando il comando pip install).


7
Pip-tools funziona alla grande - la sintassi aggiornata è pip-compile -U requirements.txt.
erikreed

Risposte:


40

No. Il file dei requisiti è stato bloccato su versioni specifiche. Se i tuoi requisiti sono impostati su quella versione, non dovresti tentare di eseguire l'aggiornamento oltre quelle versioni. Se è necessario eseguire l'aggiornamento, è necessario passare alle versioni non appuntate nel file dei requisiti.

Esempio:

lxml>=2.2.0

Questo aggiornerà lxml a qualsiasi versione più recente della 2.2.0

lxml>=2.2.0,<2.3.0

Questo aggiornerà lxml alla versione più recente tra 2.2.0 e 2.3.0.


2
Ho trovato utile fare quanto segue. 1. Eliminato venv 2. Creato uno nuovo con lo stesso nome (il modo per pulire tutti i pacchetti pip) 3. Sostituisci tutto == con> = nel requirements.txt 4. pip install -r requirements.txt 4.
zhukovgreen

sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt sostituirà tutto ==con>=
philshem

80

Puoi provare:

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

Puoi anche ignorare il pacchetto installato e installare quello nuovo:

pip install --ignore-installed -r requirements.txt

2
con questa opzione sembra reinstallare la stessa versione. Come Andy ha menzionato nella risposta sopra, i pacchetti sono bloccati su una versione specifica.
abhiomkar

@abhiomkar sei giusto Pensavo volessi reinstallare la stessa versione (forse per aggiungere la correzione del backport)
Freelancer

1
Il secondo comando è quello che stavo cercando. Si noti che -Ie --ignore-installedsono le stesse bandiere e, naturalmente, non è valido averne una ,. In questo modo non si verificherà alcun downgrade durante l'installazione e una volta completata l'installazione dei requisiti, è possibile aggiornare i pacchetti installati utilizzando pip-review --auto.
AXO

79

Ho già risposto a questa domanda qui . Ecco la mia soluzione:

Poiché non esisteva un modo semplice per aggiornare pacchetto per pacchetto e aggiornare il file requirements.txt, ho scritto questo pip-upgrade che aggiorna anche le versioni nel tuo requirements.txtfile per i pacchetti scelti (o tutti i pacchetti).

Installazione

pip install pip-upgrader

uso

Attiva il tuo virtualenv (importante, perché installerà anche le nuove versioni dei pacchetti aggiornati nell'attuale virtualenv).

cd nella directory del progetto, quindi eseguire:

pip-upgrade

Utilizzo avanzato

Se i requisiti vengono inseriti in una posizione non standard, inviarli come argomenti:

pip-upgrade path/to/requirements.txt

Se sai già quale pacchetto vuoi aggiornare, inviali semplicemente come argomenti:

pip-upgrade -p django -p celery -p dateutil

Se è necessario eseguire l'aggiornamento alla versione pre-rilascio / post-rilascio, aggiungere un --prereleaseargomento al comando.

Divulgazione completa: ho scritto questo pacchetto.


5
Grande! È sorprendente che una tale funzione non sia presente direttamente in pip
Jacopofar

5
Elegante!
Molto

3
Ho appena usato questo, e questa è la cosa migliore dopo le stringhe f.
Pierre.Sassoulas

1
Ottimo strumento. Grazie.
mszaro

Strumento molto utile! Ho anche trovato un altro pacchetto chiamato pur che aggiorna anche le versioni
bloccate

4

Suggerisco di congelare tutte le tue dipendenze per avere build prevedibili .

Quando lo fai, puoi aggiornare tutte le dipendenze contemporaneamente in questo modo:

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

Dopo aver fatto quanto sopra, prova il tuo progetto con il nuovo set di pacchetti ed eventualmente salva il requirements.txtfile nel repository.


3

Ho dovuto fare lo stesso ... ho usato questa piccola battuta per fare il lavoro:

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

quale:

  • packages=$(cat requirements.txt | sed 's/==.*//g') crea un elenco dei nomi dei pacchetti correnti in requirements.txt (rimuovendo la versione).
  • echo $packages | xargs pip3 install -U quindi passa tutti i pacchetti come argomenti a pip3 per l'aggiornamento.
  • freeze=$(pip3 freeze); Ottiene tutte le versioni correnti del pacchetto nel formato richiesto per requirements.txt
  • for p in $(echo $packages) quindi itera attraverso i nomi dei pacchetti
    • echo $freeze | grep -E "^${p}==" >> requirements.new ottiene la riga della versione del pacchetto dall'output di pip freeze che corrisponde al pacchetto e scrive in new requirements.txt

Questo ha l'ulteriore vantaggio di preservare l'ordinamento del file requirements.txt originale. :)

Spero che questo ti aiuti!


2

Dato che non potevo farlo usando bash, ho scritto un modulo python per creare un nuovo file dei requisiti senza versioni e usarlo:

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()

Quindi installa le librerie dal nuovo file pip install -U -r requirements-prod-no-version.pip

Infine congelare le versioni nel file originale pip freeze > requirements-prod.pip


2

Un'altra soluzione è usare il pacchetto upgrade-requirements

pip install upgrade-requirements

E poi esegui:

upgrade-requirements

Aggiornerà tutti i pacchetti che non sono alle loro ultime versioni e creerà anche un requirements.txt aggiornato alla fine.


0
  • 1) Per aggiornare i file installati da pip da reqs.txt aggiungere > = in sostituzione di == questo dirà a pip di installare lib maggiore o uguale alla versione richiesta, qui installando la versione più aggiornata della libreria richiesta

    1.a) ** La mia risposta per il thread ** Aggiungendo py -m pip install -r reqs.txt a un riavvio quotidiano ... o qualcosa del genere è possibile aggiornare le librerie installate. Riassunto da Andy Perfectly

    -Il motivo per cui sono entrato in questo thread era trovare informazioni su come aggiornare pip di base env virtuale (di solito 10.0.03 per me ??)

nella speranza di soddisfare un problema di cui sono stato in grado di derivare una delle due soluzioni

A. creazione di venv || B. Installazione delle librerie richieste

Grazie ad Andy ho soddisfatto il bisogno B

Aggiungendo pip > = versione richiesta in reqs.txt

all'istanza di un nuovo ambiente virtuale || ri-istanziazione del precedente Venv

  1. py -m venv devenv

per configurare il nuovo dev env

  1. devenv\scripts\activate.bat

per attivare dev env

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

per installare le librerie di base

produce output

Raccolta di pip > = 20.0.2 (da -r requirenments.txt (riga 1)) Utilizzo della cache> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-p3-py nessuno-any.whl

Trovato installazione esistente: pip 10.0.1

Disinstallazione di pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Ci scusiamo per il Brain Dump, spero che questo aiuti qualcuno :)

🤳 Austin 👨‍🎤🚀🥊


0

La seconda risposta è la più utile ma quello che volevo fare è bloccare alcuni pacchetti mentre ne ho altri all'ultima versione (es. Youtube-dl).

Un esempio requirements.txtsarebbe questo (~ significa compatibile):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Quindi nel terminale, usa il comando pip install --upgrade -r requirements.txt

Ciò garantisce che Pillow rimarrà alla 6.2.2, le richieste verranno aggiornate all'ultima 2.22.x (se disponibile) e l'ultima versione di youtube-dl verrà installata se non già.


0

Immagino che la soluzione più semplice sia creare il requirements.txt con:

pip freeze | sed 's/==/>=/' > requirements.txt

-1

Se installi qualcosa nel tuo progetto django e dopo l'installazione desideri aggiornare il tuo file dei requisiti, questo comando può aggiornare il tuo file requisit.txt pip freeze> requirements.txt

se il tuo file dei requisiti non esiste nel tuo progetto puoi usare questo comando per creare un nuovo file Requisito.txt pip freeze> requirements.txt


questa è una cattiva idea perché aggiungerà anche i requisiti di tutti i tuoi requisiti, risultando in un file dei requisiti inutilmente grande. Se poi si decide di aggiornare una singola dipendenza, è probabile che si verifichino conflitti di versione, a meno che non si sappia quali altri requisiti sono stati aggiunti al file dei requisiti a causa di quel pacchetto.
rivolta il

-10

Modifico il requirements.txt come di seguito ed eseguo $ 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;

3
Questo è un esempio ideale dell'anti-pattern. Cosa c'è che non va qui: 1) Il requirements.txt è un file .txt, ma lo hai reso eseguibile 2). C'è un semplice comando pip install -r requirements.txt. Quindi puoi usare il file requirements.txt solo per elencare le dipendenze del tuo progetto. 3) Non stai usando le versioni dei pacchetti. 4) Non è un modello comune, gli altri sviluppatori non fanno nulla su come usarlo. 5) Difficile da usare con pipeline CI / CD. Si prega di non utilizzare questo esempio
Fannigurt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.