Dlaczego pip instaluje starą wersję mojego pakietu?

80

Właśnie przesłałem nową wersję mojego pakietu do PyPi (1.2.1.0-r4): mogę pobrać plik egg i zainstalować go za pomocą easy_install, a wersja sprawdza się poprawnie. Ale kiedy próbuję zainstalować za pomocą pip, zamiast tego instaluje wersję 1.1.0.0. Nawet jeśli wyraźnie określę wersję do pipowania pip install -Iv tome==1.2.1.0-r4, otrzymuję ten komunikat :, Requested tome==1.2.1.0-r4, but installing version 1.1.0.0ale nie rozumiem dlaczego.

Dwukrotnie sprawdziłem parse_versioni potwierdziłem, że ciąg wersji w 1.2.1 jest większy niż w 1.1.0, jak pokazano:

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

Więc jakikolwiek pomysł, dlaczego zamiast tego zdecydował się zainstalować 1.1.0?

brianmearns
źródło
Nie można odtworzyć. pip install -Iv tome==1.2.1.0-r4instaluje się dla mnie (zarówno według wiadomości, jak i pip freezepakietu tome==1.2.1.0-r4.
David Robinson
Pewnie wciąż gdzieś na twojej drodze? Wypróbuj z-U
Wolph,
Hm… w porządku, to interesujące. Próbowałem odinstalować go za pomocą pip, myślę, że będę musiał przekopać się jeszcze trochę i upewnić się, że wszystko zniknęło. Dzięki za sprawdzenie!
brianmearns
Wygląda na jakiś błąd w pip. Mam podobny problem, ale nie mogę zainstalować starszej wersji django-tastypie.
simplylizz

Odpowiedzi:

95

To doskonałe pytanie. Wieki zajęło mi to rozgryzienie. To rozwiązanie, które działa u mnie:

Najwyraźniej, jeśli pipmożna znaleźć lokalną wersję pakietu, pipwolałby wersje lokalne od zdalnych. Odłączyłem nawet komputer od Internetu i spróbowałem ponownie - gdy pippakiet nadal został pomyślnie zainstalowany i nawet nie narzekałem, źródło było oczywiście lokalne.

W moim przypadku naprawdę zagmatwana część polegała na tym, że pipznalazłem nowsze wersje na pypi , zgłosiłem je, a następnie i tak zainstalowałem ponownie starszą wersję ... arggh. Nie powiedział mi też, co robi i dlaczego.

Jak więc rozwiązałem ten problem?

Możesz uzyskać pipszczegółowe dane wyjściowe za pomocą -vflagi ... ale jedno nie wystarczy. Opublikowałem pomoc w formacie RTFM, który mówi, że możesz wykonać -vwiele razy, do 3 razy, aby uzyskać bardziej szczegółowe wyniki. Więc zrobiłem:

pip install -vvv <my_package>

Następnie przejrzałem dane wyjściowe. Jedna linijka zwróciła moją uwagę:

Źródło w / tmp / pip-build-root / ma wersję 0.0.11, która spełnia wymaganie <my_package>

Usunąłem ten katalog, po czym pipzainstalowałem najnowszą wersję z pypi.

Matt Fenwick
źródło
Wygląda na to, że nie zostało to jeszcze naprawione.
Ale
1
@ Ale110 Zostało to naprawione - zobacz moją odpowiedź po szczegóły.
Piotr Dobrogost
5
FYI, którego możesz użyć -vvvzamiast -v -v -v.
bfontaine
3
Możesz także użyć --no-cache-dirflagi, zamiast szukać i usuwać plik w /tmp/.
ethanabrooks
41

Spróbuj wymusić ponowne pobranie pakietu za pomocą:

pip install --no-cache-dir --upgrade <package>
Iacchus
źródło
1
To zadziałało dla mnie. Wreszcie otrzymałem v0.4 photoutils zainstalowanych w wersji v0.2.1. Pip pobierał tar v0.4, ale potem po prostu zainstalował (lub zachował) v0.2.1. Flagi --no-cache-dir i --upgrade wreszcie to zrobiły! Dziękuję
scibuff
4
To jest właściwa odpowiedź. Pip domyślnie przechowuje pamięć podręczną odpowiedniej strony Pypi przez 600 sekund. Więc nawet jeśli usuniesz lokalnie buforowany pakiet, musisz poczekać 10 minut, aż pip pobierze nową stronę ze wszystkimi linkami do nowej wersji.
brthornbury
1
Wydaje się, że to bardzo logiczna odpowiedź. Jednak pip nadal instaluje tę samą starą wersję, mimo że wersja, którą widzę, pip searchjest nowsza.
Mavamaarten
1
Spróbuj sprawdzić, czy to coś z virtualenv. Ah wersje pythona.
Iacchus
25

Dzięki Marcusowi Smithowi , który wykonuje niesamowitą pracę jako konserwator pip, zostało to naprawione w wersji 1.4 pip, która została wydana 23-07-23.

Istotne informacje z dziennika zmian dla tej wersji

Naprawiono szereg problemów (# 413, # 709, # 634, # 602 i # 939) związanych z czyszczeniem i brakiem ponownego wykorzystania katalogów kompilacji. (Pociągnij # 865, # 948)

Piotr Dobrogost
źródło
5
Powinno to być oznaczone jako poprawna odpowiedź. Upgrade pip w ten sposób:pip install -U pip
Emil Stenström
2
Ta poprawka nadal nie odnosi się do pip po cichu przy użyciu wersji buforowanej, którą można rozwiązać za pomocą odpowiedzi Iacchusa
Burrito
1
Nie, wydaje się, że nie zostało to naprawione. Mam teraz ten sam problem.
Regis maj
17

Odkryłem tutaj , że w pip jest znany błąd polegający na tym, że nie sprawdza wersji, jeśli istnieje katalog kompilacji z rozpakowanymi źródłami. Sprawdziłem to na moim kłopotliwym pakiecie i po usunięciu jego źródeł z katalogu kompilacji, pip zainstalował wymaganą wersję.

simplylizz
źródło
2
Dzięki za informację. Masz pomysł, gdzie powinienem szukać katalogu kompilacji? Próbowałem usunąć go z Python \ Lib \ site-packages, ale wyniki były takie same. Nie wykonuję polecenia z lokalizacji, w której pakiet istnieje, ani nic.
brianmearns
@ sh1ftst0rm Używam virtualenv pod linuxem i dla django-tastypie było tak: "$ VIRTUAL_ENV / build / django-tastypie". Spróbuj sprawdzić górną część katalogu Pythona lub po prostu użyj wyszukiwania w swoim systemie. Możesz także spróbować użyć "pip install -b <ścieżka do katalogu kompilacji niestandardowej>".
simplylizz
1
Wygląda na to, że nie jest to mój problem, szukałem daleko i szeroko i nie mogę znaleźć żadnych śladów pakietu ani katalogu kompilacji dla niego w moim systemie. To musi być jakiś inny błąd w pip = (. Dobra wskazówka, jestem pewien, że będzie to poprawka dla wielu ludzi.
brianmearns
9

Jeśli używasz pipwersji, która jest dostarczana z niektórymi pakietami dystrybucyjnymi (np. Ubuntu python-pip), może być konieczne zainstalowanie nowszej pipwersji:

Zaktualizuj pipdo najnowszej wersji:

sudo pip install -U pip

W przypadku „virtualenv” pomiń „sudo”:

pip install -U pip

Następujące polecenie może być wymagane, jeśli twoja powłoka zgłasza coś takiego -bash: /usr/bin/pip: No such file or directorypo pipaktualizacji:

hash -d pip

Teraz zainstaluj pakiet jak zwykle:

pip install -U foo

lub

pip install foo==package.version.here

ribozz
źródło
6

Ten sam problem dotyczy aktualizacji pika z 0.9.5 do 0.9.8. Sposób, w jaki działa tylko było zainstalować z archiwum: pip install https://pypi.python.org/packages/source/p/pika/pika-0.9.8.tar.gz.

Litość
źródło
2
+1 Dzięki, to mnie nakłoniło do czegoś ważnego: pip opiera się na dystrybucjach źródeł: w mojej najnowszej wersji zapomniałem załadować źródłowego dista, więc kiedy próbowałem zainstalować, otrzymywał tylko poprzednią wersję. To nie rozwiązuje mojego pierwotnego problemu, ale warto wiedzieć.
brianmearns
1

W moim przypadku musiałem usunąć .pipfolder w moim katalogu domowym, a następnie mogłem uzyskać późniejsze wersje wielu bibliotek. Zauważ, że było to w systemie Linux.

pip --version
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
virtualenv --version
15.1.0
NateW
źródło
0

Zauważyłem, że jeśli używasz mikroprzerzutów, pip wydaje się ich nie rozpoznawać. Na przykład nie mogliśmy pobrać wersji 1.9.9.1 do aktualizacji.

mlissner
źródło
2
Może dlatego, że '1.9.9.1' nie jest kompatybilny SemVer patrz semver.org
tector
0

W moim przypadku używana wersja Pythona (3.4) nie spełniała wymagań dotyczących zależności Django 2.1 (python> = 3.5).

Alberto Chiusole
źródło
0

W moim przypadku instaluję za pomocą pipa pakiet .tar.gz z Artifactory, do którego robię wiele aktualizacji. Aby nadpisać moje buforowane pliki Pythona i zawsze pobrać / zainstalować najnowsze, które udało mi się uruchomić:

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

Powinieneś zobaczyć to ponownie, pobierz wszystkie niezbędne pliki i zainstaluj je, zamiast korzystać z lokalnej pamięci podręcznej.

Cheen
źródło
0

W moim przypadku ktoś opublikował najnowszą wersję pakietu z pythonem2, więc próbując pip3 installgo pobrać, złapał starszą wersję, która została zbudowana za pomocą python3.

Przydatne rzeczy do sprawdzenia podczas debugowania:

  • Jeśli pip installtwierdzi, że nie może znaleźć wersji, sprawdź, czy pip searchją widzi.
  • Spójrz na sekcję „Download Files” w repozytorium pypi - nazwy plików mogą sugerować, co jest nie tak (w moim przypadku widziałem -py2-to jasno jak w dzień).
  • Jak sugerują inni, spróbuj uruchomić pip install --no-cache-dirna wypadek, gdyby pip nie zawracał sobie głowy pytaniem o Internet, ponieważ ma już lokalną odpowiedź.
jarekwg
źródło
0

Ukryłem niewersjonowane pliki na karcie Git w PyCharm, które były instalowane, pip install .mimo że nie widziałem ich nigdzie indziej.

Znalezienie go dla mnie zajęło dużo czasu, opublikowanie tego w nadziei, że pomoże to komuś innemu.

Mandera
źródło
0

Na wszelki wypadek, gdyby ktoś inny miał kłopoty z aktualizacją torchtext (lub prawdopodobnie jakąkolwiek inną torchbiblioteką):

Chociaż https://pypi.org/project/torchtext/ stwierdza, że ​​można uruchomić pip install torchtext, musiałem zainstalować go podobnie jak torchpodając --find-linksaka -f:

pip install torchtext===0.8.1 -f https://download.pytorch.org/whl/torch_stable.html

Irytowało mnie to, że PyCharm wskazał mi nową wersję, ale nie mogłem jej znaleźć podczas próby aktualizacji do niej. Wydaje mi się, że PyCharm wykorzystuje swój własny mechanizm do wykrywania nowych wersji. Następnie, wywołując pippod maską, nie znalazł nowej wersji bez --find-linksopcji.

Tobias Uhmann
źródło