Aktualisieren Sie Python-Pakete von den Anforderungen.txt mit dem Befehl pip

111

Wie aktualisiere ich alle meine Python-Pakete mit dem Befehl pip aus der Datei "require.txt"?

versucht mit unten Befehl

$ pip install --upgrade -r requirements.txt

Da die Python-Pakete mit der Versionsnummer ( Django==1.5.1) versehen sind, scheinen sie nicht zu aktualisieren. Gibt es einen besseren Ansatz als die manuelle Bearbeitung der Datei "require.txt"?

BEARBEITEN

Wie Andy in seiner Antwort erwähnt hat, sind Pakete an eine bestimmte Version gebunden, daher ist es nicht möglich, Pakete mit dem Befehl pip zu aktualisieren.

Dies können wir jedoch mit pip-toolsdem folgenden Befehl erreichen.

$ pip-review --auto

Dadurch werden automatisch alle Pakete von der pip-toolsDatei "resources.txt" aktualisiert (stellen Sie sicher, dass Sie sie mit dem Befehl "pip install" installieren).

abhiomkar
quelle
7
Pip-Tools funktionieren hervorragend - aktualisierte Syntax ist pip-compile -U requirements.txt.
Erikreed

Antworten:

40

Nein. Ihre Anforderungsdatei wurde an bestimmte Versionen angeheftet . Wenn Ihre Anforderungen auf diese Version festgelegt sind, sollten Sie nicht versuchen, ein Upgrade über diese Versionen hinaus durchzuführen. Wenn Sie benötigen ein Upgrade, dann müssen Sie nicht fixieren Versionen in Ihrer Datei wechseln.

Beispiel:

lxml>=2.2.0

Dies würde lxml auf eine neuere Version als 2.2.0 aktualisieren

lxml>=2.2.0,<2.3.0

Dies würde lxml auf die neueste Version zwischen 2.2.0 und 2.3.0 aktualisieren.

Andy
quelle
2
Ich fand es hilfreich, Folgendes zu tun. 1. venv gelöscht 2. Ein neues mit demselben Namen erstellt (die Methode zum Reinigen aller Pip-Pakete) 3. Ersetzen Sie alle == to> = in der Anforderung.txt 4. pip install -r Anforderungen.txt 4.
zhukovgreen
sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt wird alle ersetzen ==durch>=
Philshem
80

Du kannst es versuchen:

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

Sie können das installierte Paket auch ignorieren und das neue installieren:

pip install --ignore-installed -r requirements.txt
Freiberufler
quelle
2
Mit dieser Option scheint es dieselbe Version neu zu installieren. Wie Andy in der obigen Antwort erwähnt hat, sind Pakete an eine bestimmte Version gebunden.
Abhiomkar
@abhiomkar du bist rigth Ich dachte du wolltest die gleiche Version neu installieren (vielleicht um Backport Fix hinzuzufügen)
Freelancer
1
Der zweite Befehl ist das, wonach ich gesucht habe. Beachten Sie, dass -Iund --ignore-installeddie gleichen Flags sind und es natürlich nicht gültig ist, ein ,darin zu haben. Auf diese Weise werden während der Installation keine Downgrades durchgeführt. Nach Abschluss der Installation der Anforderungen können installierte Pakete mit aktualisiert werden pip-review --auto.
AXO
79

Diese Frage habe ich hier bereits beantwortet . Hier ist meine Lösung:

Da es keine einfache Möglichkeit gab, Paket für Paket zu aktualisieren und die Datei " require.txt" zu aktualisierenrequirements.txt , habe ich diesen Pip-Upgrader geschrieben, der auch die Versionen in Ihrer Datei für die ausgewählten Pakete (oder alle Pakete) aktualisiert .

Installation

pip install pip-upgrader

Verwendung

Aktivieren Sie Ihre virtuelle Umgebung (wichtig, da dadurch auch die neuen Versionen aktualisierter Pakete in der aktuellen virtuellen Umgebung installiert werden).

cd in Ihr Projektverzeichnis und führen Sie dann Folgendes aus:

pip-upgrade

Erweiterte Verwendung

Wenn die Anforderungen an einem nicht standardmäßigen Speicherort platziert werden, senden Sie sie als Argumente:

pip-upgrade path/to/requirements.txt

Wenn Sie bereits wissen, welches Paket Sie aktualisieren möchten, senden Sie es einfach als Argumente:

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

Wenn Sie ein Upgrade auf die Pre-Release- / Post-Release-Version durchführen müssen, fügen Sie --prereleaseIhrem Befehl ein Argument hinzu.

Vollständige Offenlegung: Ich habe dieses Paket geschrieben.

Simion Agavriloaei
quelle
5
Toll! Es ist überraschend, dass eine solche Funktion nicht direkt in pip
Jacopofar
5
Elegant! Super froh, dass ich nach unten
gescrollt habe
3
Ich habe das gerade benutzt und das ist das Beste seit F-Strings.
Pierre.Sassoulas
1
Tolles Werkzeug. Danke dir.
Mszaro
Sehr nützliches Werkzeug! Ich habe auch ein anderes Paket namens pur gefunden , das auch die angehefteten Versionen aktualisiert
Gal Avineri
4

Ich schlage vor , alle Ihre Abhängigkeiten einzufrieren, um vorhersehbare Builds zu erhalten .

Dabei können Sie alle Abhängigkeiten gleichzeitig wie folgt aktualisieren :

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

Nachdem die oben getan, testen Sie Ihr Projekt mit dem neuen Satz von Paketen und schließlich begeht die requirements.txtDatei in das Repository.

Hermes
quelle
3

Ich musste nur das Gleiche tun ... habe diesen kleinen Einzeiler benutzt, um die Arbeit zu erledigen:

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

welche:

  • packages=$(cat requirements.txt | sed 's/==.*//g') Erstellt eine Liste der aktuellen Paketnamen in der Datei "resources.txt" (Entfernen der Version).
  • echo $packages | xargs pip3 install -U Übergibt dann alle Pakete als Argumente an pip3, um ein Upgrade durchzuführen.
  • freeze=$(pip3 freeze); Ruft alle aktuellen Paketversionen in dem für anforderungs.txt erforderlichen Format ab
  • for p in $(echo $packages) durchläuft dann die Paketnamen
    • echo $freeze | grep -E "^${p}==" >> requirements.new Ruft die Paketversionszeile aus der Pip-Freeze-Ausgabe ab, die mit dem Paket übereinstimmt, und schreibt in die neue Datei "require.txt"

Dies hat den zusätzlichen Vorteil, dass die Reihenfolge der ursprünglichen Anforderungen beibehalten wird. :) :)

Hoffe das hilft!

MatthewJohn
quelle
2

Da ich das mit bash nicht machen konnte, habe ich ein Python-Modul geschrieben, um eine neue Anforderungsdatei ohne Versionen zu erstellen und sie zu verwenden:

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

Installieren Sie dann die Bibliotheken aus der neuen Datei pip install -U -r requirements-prod-no-version.pip

Zum Schluss frieren Sie die Versionen in der Originaldatei ein pip freeze > requirements-prod.pip

Montaro
quelle
2

Eine andere Lösung ist es, die verwenden Upgrade-Anforderungen Paket

pip install upgrade-requirements

Und dann laufen:

upgrade-requirements

Es werden alle Pakete aktualisiert, die nicht die neuesten Versionen haben, und am Ende wird eine aktualisierte Datei "require.txt" erstellt.

dmdip
quelle
0
  • 1) Um pip installierten Dateien von Upgrade reqs.txt hinzufügen > = Ersatz von == dies pip sagen installieren lib größer oder auf die Version gleich Sie anfordern, die hier durch die meisten auf dem neuesten Stand der Installation von Version der angeforderten Bibliothek

    1.a) ** Meine Antwort für den Thread ** Durch Hinzufügen von py -m pip install -r reqs.txt zu einem täglichen Neustart ... oder etwas Ähnlichem können Sie Ihre installierten Bibliotheken aktualisieren. Von Andy Perfectly zusammengefasst

    - Mein Grund für die Eingabe dieses Threads war, Informationen zum Aktualisieren der virtuellen Env-Basis-Pip zu finden (normalerweise 10.0.03 für mich?)

In der Hoffnung, ein Problem zu lösen, von dem ich eine von zwei Lösungen ableiten konnte

A. Schaffung von venv || B. Installation der erforderlichen Bibliotheken

Dank Andy habe ich Bedürfnis B befriedigt

Durch Hinzufügen von pip > = angeforderte Version in reqs.txt

nach Instanziierung einer neuen virtuellen Umgebung || Neuinstanziierung des vorherigen Venv

  1. py -m venv devenv

um neue dev env einzurichten

  1. devenv\scripts\activate.bat

um dev env zu aktivieren

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

Basisbibliotheken installieren

yeilds Ausgabe

Sammeln von pip > = 20.0.2 (aus -r requireenments.txt (Zeile 1)) Verwenden von cached> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c2.3 none-any.whl

Vorhandene Installation gefunden: pip 10.0.1

Deinstallation von pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Entschuldigung für den Brain Dump, hoffentlich hilft das jemandem :)

🤳 Austin 👨‍🎤🚀🥊

Austin Atherton
quelle
0

Die zweite Antwort ist die nützlichste, aber ich wollte einige Pakete sperren, während andere die neueste Version haben (z. B. youtube-dl).

Ein Beispiel requirements.txtwürde so aussehen (~ bedeutet kompatibel):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Verwenden Sie dann im Terminal den Befehl pip install --upgrade -r requirements.txt

Dies stellt sicher, dass Pillow bei 6.2.2 bleibt, Anfragen auf die neueste Version 2.22.x aktualisiert werden (falls verfügbar) und die neueste Version von youtube-dl installiert wird, falls dies noch nicht geschehen ist.

Eli
quelle
0

Ich denke, die einfachste Lösung ist das Erstellen der Anforderungen.txt mit:

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

Wenn Sie etwas in Ihrem Django-Projekt installieren und nach der Installation Ihre Anforderungsdatei aktualisieren möchten, kann dieser Befehl Ihre request.txt-Datei pip freeze> require.txt aktualisieren

Wenn Ihre Anforderungsdatei in Ihrem Projekt nicht vorhanden ist, können Sie diesen Befehl verwenden, um eine neue request.txt-Datei zu erstellen. pip freeze> require.txt

Gaurav Mandhotra
quelle
Dies ist eine schlechte Idee, da dadurch auch die Anforderungen aller Ihrer Anforderungen hinzugefügt werden, was zu einer unnötig großen Anforderungsdatei führt. Wenn Sie sich dann entscheiden, eine einzelne Abhängigkeit zu aktualisieren, treten wahrscheinlich Versionskonflikte auf, es sei denn, Sie wissen, welche anderen Anforderungen aufgrund dieses Pakets zu Ihrer Anforderungsdatei hinzugefügt wurden.
Aufstand
-10

Ich bearbeite die Anforderungen.txt wie folgt und führe $ sh ./requirements.txt aus

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
quelle
3
Dies ist ein ideales Beispiel für das Anti-Muster. Was hier falsch ist: 1) Die Datei "resources.txt" ist eine TXT-Datei, die Sie jedoch ausführbar gemacht haben. 2) Es gibt einen einfachen Befehl pip install -r require.txt. Daher können Sie die Datei require.txt nur zum Auflisten Ihrer Projektabhängigkeiten verwenden. 3) Sie verwenden keine Versionen der Pakete. 4) Kein allgemeines Muster, andere Entwickler wissen nicht, wie sie es verwenden sollen. 5) Schwer zu verwenden mit CI / CD-Pipelines. Bitte verwenden Sie dieses Beispiel nicht
Fannigurt