Warum installiert pip eine alte Version meines Pakets?

79

Ich habe gerade eine neue Version meines Pakets auf PyPi (1.2.1.0-r4) hochgeladen: Ich kann die Egg-Datei herunterladen und mit easy_install installieren, und die Version wird korrekt ausgecheckt. Wenn ich jedoch versuche, mit pip zu installieren, wird stattdessen Version 1.1.0.0 installiert. Selbst wenn ich die Version, mit der piped werden soll pip install -Iv tome==1.2.1.0-r4, explizit spezifiziere , erhalte ich die folgende Meldung: Requested tome==1.2.1.0-r4, but installing version 1.1.0.0aber ich verstehe nicht warum.

Ich habe zweimal überprüft parse_versionund bestätigt, dass die Versionszeichenfolge in 1.2.1 größer ist als die in 1.1.0, wie gezeigt:

>>> from pkg_resources import parse_version as pv
>>> pv('1.1.0.0') < pv('1.2.1.0-r4')
True
>>>

Irgendeine Idee, warum stattdessen 1.1.0 installiert wird?

brianmearns
quelle
Konnte nicht reproduzieren. pip install -Iv tome==1.2.1.0-r4installiert für mich (gemäß den Nachrichten und pip freezedem Paket tome==1.2.1.0-r4.
David Robinson
Es ist wahrscheinlich noch irgendwo auf Ihrem Weg? Versuchen Sie es mit-U
Wolph
Hm ... in Ordnung, das ist interessant. Ich habe versucht, es mit pip zu deinstallieren. Ich denke, ich muss noch etwas durchforsten und sicherstellen, dass alles weg ist. Danke für das Kontrollieren!
Brianmearns
Sieht aus wie ein Fehler in Pip. Ich habe ein ähnliches Problem, kann aber keine ältere Version von django-tastypie installieren.
simplylizz

Antworten:

95

Dies ist eine ausgezeichnete Frage. Ich habe ewig gebraucht, um es herauszufinden. Dies ist die Lösung, die für mich funktioniert:

Wenn pipSie eine lokale Version des Pakets finden können, pipwerden Sie anscheinend die lokalen Versionen den Remote-Versionen vorziehen. Ich habe sogar meinen Computer vom Internet getrennt und es erneut versucht - als pipdas Paket noch erfolgreich installiert wurde und ich mich nicht einmal beschwerte, war die Quelle offensichtlich lokal.

Der wirklich verwirrende Teil in meinem Fall war, dass pipdie neueren Versionen auf pypi gefunden , gemeldet und dann trotzdem die ältere Version neu installiert wurden ... arggh. Außerdem hat es mir nicht gesagt, was es tat und warum.

Wie habe ich dieses Problem gelöst?

Sie können pipmit dem -vFlag eine ausführliche Ausgabe geben ... aber eine reicht nicht aus. Ich habe die Hilfe RTFM-bearbeitet, die besagt, dass Sie -vmehrere Male bis zu 3x für eine ausführlichere Ausgabe tun können . So tat ich:

pip install -vvv <my_package>

Dann habe ich die Ausgabe durchgesehen. Eine Zeile fiel mir auf:

Die Quelle in / tmp / pip-build-root / hat die Version 0.0.11, die die Anforderung <my_package> erfüllt

Ich habe dieses Verzeichnis gelöscht und danach die pipneueste Version von pypi installiert.

Matt Fenwick
quelle
Sieht so aus, als ob dies noch nicht behoben wurde.
Ale
1
@ Ale110 Es wurde behoben - siehe meine Antwort für Details.
Piotr Dobrogost
5
Zu Ihrer Information können Sie -vvvanstelle von verwenden -v -v -v.
Bfontaine
3
Sie können auch das --no-cache-dirFlag verwenden, anstatt die Datei in zu suchen und zu löschen /tmp/.
Ethanabrooks
40

Versuchen Sie erneut, das Paket herunterzuladen mit:

pip install --no-cache-dir --upgrade <package>
Iacchus
quelle
1
Das hat bei mir funktioniert. Endlich wurde v0.4 von Photoutils über v0.2.1 installiert. Pip hat v0.4 tar heruntergeladen, aber dann hat es nur v0.2.1 installiert (oder behalten). Die Flags --no-cache-dir und --upgrade haben es endlich geschafft! Vielen Dank
Scibuff
4
Dies ist hier die richtige Antwort. Pip speichert standardmäßig 600 Sekunden lang einen Cache der entsprechenden Pypi-Seite. Selbst wenn Sie das lokal zwischengespeicherte Paket entfernen, müssen Sie 10 Minuten warten, bis pip die neue Seite mit allen Links zur neuen Version abgerufen hat.
Brthornbury
1
Dies scheint eine sehr logische Antwort zu sein. Pip-Installationen erhalten jedoch immer noch dieselbe alte Version, obwohl die Version, die ich über sehe, pip searchneuer ist.
Mavamaarten
1
Versuchen Sie zu überprüfen, ob es sich um etwas mit virtualenv handelt. Ah Python-Versionen.
Iacchus
25

Dank Marcus Smith , der hervorragende Arbeit als Instandhalter von Pip leistet, wurde dies in Version 1.4 von Pip behoben, die am 23.07.2013 veröffentlicht wurde.

Relevante Informationen aus dem Changelog für diese Version

Es wurde eine Reihe von Problemen behoben (Nr. 413, Nr. 709, Nr. 634, Nr. 602 und Nr. 939), die mit dem Bereinigen und Nichtverwenden von Build-Verzeichnissen zusammenhängen. (Ziehen Sie # 865, # 948)

Piotr Dobrogost
quelle
5
Dies sollte als die richtige Antwort markiert werden. Upgrade Pip wie folgt:pip install -U pip
Emil Stenström
2
Dieser Fix behebt Pip immer noch nicht stillschweigend mit einer zwischengespeicherten Version, die mit Iacchus 'Antwort
Burrito
1
Nein, es scheint nicht behoben zu sein. Ich habe gerade das gleiche Problem.
Regis
17

Ich habe hier festgestellt , dass es einen bekannten Fehler in pip gibt, der die Version nicht überprüft, wenn es ein Build-Verzeichnis mit entpackten Quellen gibt. Ich habe dies auf meinem problematischen Paket überprüft und nach dem Löschen seiner Quellen aus dem Build-Verzeichnis pip die erforderliche Version installiert.

simplylizz
quelle
2
Danke für die Auskunft. Irgendeine Idee, wo ich nach dem Build-Verzeichnis suchen soll? Ich habe versucht, es aus Python \ Lib \ site-packages zu löschen, aber die Ergebnisse waren dieselben. Ich führe den Befehl nicht an einem Ort aus, an dem das Paket vorhanden ist oder so.
Brianmearns
@ sh1ftst0rm Ich benutze virtualenv unter Linux und für django-tastypie war es das: "$ VIRTUAL_ENV / build / django-tastypie". Versuchen Sie, den Anfang des Python-Verzeichnisses zu überprüfen, oder verwenden Sie einfach die Suche in Ihrem System. Sie können auch versuchen, "pip install -b <Pfad zum benutzerdefinierten Build-Verzeichnis>" zu verwenden.
simplylizz
1
Dies scheint nicht mein Problem zu sein. Ich habe weit und breit gesucht und kann auf meinem System keine Spur des Pakets oder ein Build-Verzeichnis dafür finden. Es muss ein anderer Fehler in pip sein = (.
Trotzdem
9

Wenn Sie eine pipVersion verwenden, die mit einigen Distributionspaketen geliefert wird (z. B. Ubuntu python-pip), müssen Sie möglicherweise eine neuere pipVersion installieren :

Update pipauf die neueste Version:

sudo pip install -U pip

Bei "virtualenv" überspringen Sie "sudo":

pip install -U pip

Der folgende Befehl kann erforderlich sein, wenn Ihre Shell etwas wie -bash: /usr/bin/pip: No such file or directorynach dem pipUpdate meldet :

hash -d pip

Installieren Sie nun Ihr Paket wie gewohnt:

pip install -U foo

oder

pip install foo==package.version.here

ribozz
quelle
6

Ich habe das gleiche Problem beim Aktualisieren von pika 0.9.5 auf 0.9.8. Die einzige Arbeitsweise war die Installation von Tarball : pip install https://pypi.python.org/packages/source/p/pika/pika-0.9.8.tar.gz.

Ruth
quelle
2
+1 Danke, das hat mich auf etwas Wichtiges hingewiesen: pip ist auf Quelldistributionen angewiesen: Bei meiner neuesten Version habe ich vergessen, eine Quelldistanz hochzuladen. Wenn ich also versuchte, sie zu installieren, wurde nur die vorherige Version angezeigt. Dies löst mein ursprüngliches Problem nicht, aber es ist hilfreich zu wissen.
Brianmearns
1

Für meinen Fall musste ich den .pipOrdner in meinem Home-Verzeichnis löschen und konnte dann spätere Versionen mehrerer Bibliotheken erhalten. Beachten Sie, dass dies unter Linux war.

pip --version
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
virtualenv --version
15.1.0
NateW
quelle
0

Ich habe festgestellt, dass Pip Mikroversionen nicht erkennt, wenn Sie sie verwenden. Zum Beispiel konnten wir Version 1.9.9.1 nicht zum Upgrade bringen.

mlissner
quelle
2
Vielleicht, weil '1.9.9.1' nicht SemVer-kompatibel ist, siehe semver.org
tector
0

In meinem Fall erfüllte die verwendete Python-Version (3.4) nicht die Anforderungen für Django 2.1-Abhängigkeiten (Python> = 3.5).

Alberto Chiusole
quelle
0

In meinem Fall installiere ich ein .tar.gz-Paket von Artifactory, an dem ich viele Aktualisierungen vornehme. Um meine zwischengespeicherten Python-Dateien zu überschreiben und immer das Neueste zu holen / zu installieren, das ich ausführen konnte:

pip install --no-cache-dir --force-reinstall <path/to/tar.gz>

Sie sollten sehen, dass alle erforderlichen Dateien erneut heruntergeladen und installiert werden, anstatt Ihren lokalen Cache zu verwenden.

Cheen
quelle
0

In meinem Fall hatte jemand die neueste Version eines Pakets mit python2 veröffentlicht, also versuchte er es pip3 install es eine ältere Version packte das hatte mit python3 gebaut.

Praktische Dinge, die Sie beim Debuggen überprüfen sollten:

  • Wenn pip install behauptet wird, die Version nicht finden zu können, prüfen pip searchSie , ob sie angezeigt werden kann.
  • Schauen Sie sich den Abschnitt "Dateien herunterladen" im Pypi-Repo an - die Dateinamen könnten darauf hindeuten, was falsch ist (in meinem Fall habe ich gesehen -py2- dort klar als Tag gesehen).
  • Versuchen Sie, wie von anderen vorgeschlagen, zu laufen, pip install --no-cache-dirfalls pip sich nicht die Mühe macht, das Internet zu fragen, da Ihre Antwort bereits lokal vorhanden ist.
jarekwg
quelle
0

Ich hatte nicht versionierte Dateien unter der Registerkarte Git in PyCharm versteckt, mit denen installiert wurde pip install . , obwohl ich die Dateien nirgendwo anders gesehen hatte.

Es hat lange gedauert, es für mich zu finden, und dies in der Hoffnung gepostet, dass es jemand anderem hilft.

Mandera
quelle