Wie kann ich bestimmte Pakete mit pip und einer Anforderungsdatei aktualisieren?

436

Ich verwende pip mit einer Anforderungsdatei in einer virtuellen Umgebung für meine Django-Projekte. Ich versuche, einige Pakete zu aktualisieren, insbesondere Django selbst, und es wird eine Fehlermeldung zu Quellcodekonflikten angezeigt:

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

Das ist nach dem Aktualisieren der Versionsnummer von Django von 1.2.3 auf 1.2.4 in meiner Anforderungsdatei. Ich verwende diesen Befehl, um das Upgrade tatsächlich durchzuführen:

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

Ich kann kein Flag finden, das einen erneuten Download des Gesamtpakets auslöst. Ich habe sogar versucht, zuerst einen Deinstallationsbefehl auszuführen, dann die Installation, aber keine Würfel. Vielleicht fehlt mir etwas?

gcaprio
quelle
1
Bitte überprüfen Sie die Antwort von @ dr-jimbob, da neuere Versionen von pip tatsächlich alle anderen Abhängigkeiten aktualisieren, von denen das zu aktualisierende Paket abhängt.
Lokesh Meher

Antworten:

61

Ich bin mir nicht sicher, ob es genau Ihr Problem ist, aber in meinem Fall konnte ich Django nicht auf 1.2.4 aktualisieren. Ich war immer mit der Version 1.2.3 fertig und habe Django deinstalliert mit:

<virtualenv>/bin/pip uninstall Django

Dann habe ich das <virtualenv>/build/DjangoVerzeichnis entfernt und schließlich die richtige Version installiert mit:

<virtualenv>/bin/pip install Django

Hoffe das wird helfen.

Marcin Świerczyński
quelle
53
Dies ist nicht die beste Vorgehensweise. Verwenden Sie pip install Django -Uoder pip install Django --upgradewie in der Antwort von @JoeyG beschrieben.
Ahmad
@ Ahmad stimme zu. Es sollte einen reibungslosen Aktualisierungsprozess in pip und virtual env geben.
Parth Joshi
1270

Ich habe den folgenden Befehl ausgeführt und er wurde von 1.2.3 auf 1.4.0 aktualisiert

pip install Django --upgrade

Verknüpfung für das Upgrade:

pip install Django -U

Hinweis : Wenn für das Paket, das Sie aktualisieren, Anforderungen gelten, aktualisiert dieser Befehl zusätzlich alle Anforderungen auf die neuesten verfügbaren Versionen. In neueren Versionen von pip können Sie dieses Verhalten durch Angabe verhindern--upgrade-strategy only-if-needed . Mit diesem Flag werden Abhängigkeiten nicht aktualisiert, es sei denn, die installierten Versionen der abhängigen Pakete erfüllen nicht mehr die Anforderungen des aktualisierten Pakets.

JoeyG
quelle
7
Dies hat für mich alle meine verpackten und total durcheinander gebracht !!!! Dokumente besagen: - Aktualisieren Sie alle Pakete auf die neueste verfügbare Version. Ist das richtig oder habe ich etwas falsch gemacht?
Prometheus
4
@OrbiterFleet ich brauchte „Anforderungen“ zu aktualisieren , damit ich tat pip install Requests --upgradeund nur „Anfragen“ aufgerüstet wurde. Die Beschreibung lautet "Alle angegebenen Pakete aktualisieren ", wenn ich die Dokumente ansehe.
Harperville
31
ACHTUNG, es aktualisiert auch alle Abhängigkeiten und kann alles durcheinander bringen. Die beste Option ist die Deinstallation und Neuinstallation des Pakets.
marcelosalloum
3
um bestimmte Pakete zu aktualisieren, verwenden Siepip install --upgrade django==1.4.0
whale_steward
Dies sollte die richtige Antwort gemäß der Frage sein, oder die Frage selbst ist falsch.
Int Soumen
51

gemäß pip docs Beispiel 3

pip install --upgrade django

Nach meiner Erfahrung wird mit dieser Methode jedoch auch jedes damit verbundene Paket aktualisiert. Beispiel:

Angenommen, Sie möchten ein Upgrade durchführen somepackage, für django >= 1.2.4das diese Methode erforderlich ist. Außerdem wird ein Upgrade somepackageUND djangoauf das neueste Update durchgeführt. Nur um sicher zu gehen, tun Sie:

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

somepackageWenn Sie dies tun, wird Django auf die Version 1.2.4 aktualisiert und beibehalten

whale_steward
quelle
Guter Fang, aber Ihre Erklärung ist verwirrend, da Sie als Hauptpaket mit djangodem Beispiel begonnen haben, das Sie verwenden, somepackageund dann djangoals Abhängigkeit verwenden.
Langer
34

Der Verknüpfungsbefehl für --upgrade:

pip install Django --upgrade

Ist:

pip install Django -U
Aaron Lelevier
quelle
7
Wie wäre es, wenn Sie die vorhandene Antwort bearbeiten, um diese Informationen anstelle einer (unvollständigen) Antwort hinzuzufügen?
a1an
@ a1an Bitte schlagen Sie vor, welche zusätzlichen Informationen Ihrer Meinung nach in einer "vorgeschlagenen Bearbeitung" hinzugefügt werden sollen. Vielen Dank
Aaron Lelevier
4
Ich meine, Sie könnten die Antwort von JoeyG bearbeiten und die Verknüpfungsoption hinzufügen, die Sie dort im Kontext angegeben haben.
a1an
17

Wenn Sie ein Paket aktualisieren, wird das alte deinstalliert.

Eine bequeme Möglichkeit, dies zu tun, besteht darin, diesen Pip-Upgrader zu verwenden, der auch die Versionen in Ihrem aktualisiertrequirements.txt Datei für die ausgewählten Pakete (oder alle Pakete) .

Installation

pip install pip-upgrader

Verwendungszweck

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 sind, 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 hinzu --prerelease Ihrem Befehl ein Argument hinzu.

Vollständige Offenlegung: Ich habe dieses Paket geschrieben. Ich hoffe es hilft.

Simion Agavriloaei
quelle
1
Gibt es eine Option, um alle Pakete auf einmal zu aktualisieren (dh ohne sie aufzulisten) mit diesem Ansatz?
Björks Nummer eins Fan
1
@MikePalmice yes: pip-upgrade -p allAktualisiert alle Ihre Pakete und aktualisiert die Anforderungsdatei, ohne dass Sie Eingaben benötigen.
Simion Agavriloaei
15

Wenn Sie nur ein bestimmtes Paket mit dem Namen aktualisieren möchten, somepackagelautet der Befehl, den Sie in neueren Versionen von pip verwenden sollten

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

Dies ist sehr nützlich, wenn Sie eine Anwendung in Django entwickelt haben, die derzeit nur mit einer bestimmten Version von Django (z. B. Django = 1.9.x) funktioniert und ein abhängiges Paket mit einer Fehlerbehebung / neuen Funktion aktualisieren möchte und das aktualisierte Paket davon abhängt auf django (funktioniert aber mit etwa jeder Version von django nach 1.5). Das Standardverhalten von pip install --upgrade django-some-packagewäre, Django auf die neueste verfügbare Version zu aktualisieren, die andernfalls Ihre Anwendung beschädigen könnte, obwohl die --upgrade-strategy only-if-neededabhängigen Pakete jetzt nur bei Bedarf aktualisiert werden.

Dr. Jimbob
quelle
4

Normalerweise räumt pip nach sich selbst auf und entfernt den Inhalt des Build-Verzeichnisses. Dies geschieht nur dann nicht, wenn:

  1. Sie haben die --no-installOption verwendet
  2. Sie verwenden bearbeitbare Pakete
  3. Die Installation wurde abgebrochen oder anderweitig unterbrochen.

In allen anderen Fällen sollten Sie kein buildVerzeichnis haben, das Ihre Umgebung verstopft.

Burhan Khalid
quelle
1

Das Definieren einer bestimmten Version für das Upgrade hat mir geholfen, anstatt nur den Befehl zum Aktualisieren.

pip3 install larapy-installer==0.4.01 -U
Bedram Tamang
quelle
0

das löste für mich das Problem "pip install -I --upgrade psutil --force" danach deinstalliere einfach psutil mit der neuen Version und hoffe du kannst plötzlich die ältere Version installieren (:

Eran Hpac
quelle
0

Ich benutze das:

pip3 install -r  requirements.txt  
Shahab Rahnama
quelle