Почему pip устанавливает старую версию моего пакета?

80

Я только что загрузил новую версию своего пакета в PyPi (1.2.1.0-r4): я могу загрузить файл яйца и установить его с помощью easy_install, и версия будет проверена правильно. Но когда я пытаюсь установить с помощью pip, вместо этого устанавливается версия 1.1.0.0. Даже если я явно укажу версию, которую нужно использовать pip install -Iv tome==1.2.1.0-r4, я получаю это сообщение:, Requested tome==1.2.1.0-r4, but installing version 1.1.0.0но я не понимаю почему.

Я дважды проверил parse_versionи подтвердил, что строка версии в 1.2.1 больше, чем в 1.1.0, как показано:

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

Итак, есть идеи, почему вместо этого он решил установить 1.1.0?

Brianmearns
источник
Не удалось воспроизвести. pip install -Iv tome==1.2.1.0-r4устанавливается для меня (согласно сообщениям и pip freezeпакету tome==1.2.1.0-r4.
Дэвид Робинсон,
Возможно, это все еще где-то на вашем пути? Попробуйте это с-U
Wolph
Хм .. хорошо, это интересно. Я попытался удалить его с помощью pip, думаю, мне придется еще покопаться и убедиться, что все прошло. Спасибо за проверку!
brianmearns
Похоже на ошибку в pip. У меня аналогичная проблема, но я не могу установить более старую версию django-tactpie.
simplelizz 03

Ответы:

95

Это отличный вопрос. Мне потребовалась целая вечность, чтобы понять. Это решение, которое мне подходит:

Видимо, если pipудастся найти локальную версию пакета, pipпредпочтет локальные версии удаленным. Я даже отключил свой компьютер от Интернета и попробовал еще раз - когда pipвсе еще успешно установил пакет и даже не жаловался, источник явно был локальным.

В моем случае действительно сбивалаpip с толку то , что я нашел более новые версии на pypi , сообщил о них, а затем все равно переустановил старую версию ... arggh. Кроме того, он не сказал мне, что он делал и почему.

Итак, как я решил эту проблему?

Вы можете получить pipподробный вывод, используя -vфлаг ... но одного недостаточно. Я RTFM-редактировал справку, в которой говорилось, что вы можете делать -vнесколько раз, до 3 раз, для более подробного вывода. Так я и сделал:

pip install -vvv <my_package>

Потом просмотрел вывод. Мое внимание привлекла одна строчка:

Источник в / tmp / pip-build-root / имеет версию 0.0.11, которая удовлетворяет требованию <my_package>

Я удалил этот каталог, после чего pipустановил последнюю версию из pypi.

Мэтт Фенвик
источник
Похоже, это еще не исправлено.
Ale
1
@ Ale110 Это исправлено - подробности см. В моем ответе.
Петр Доброгост,
5
К вашему сведению, вы можете использовать -vvvвместо -v -v -v.
bfontaine 02
3
Вы также можете использовать --no-cache-dirфлаг вместо поиска и удаления файла в /tmp/.
ethanabrooks
41

Попробуйте снова принудительно загрузить пакет с помощью:

pip install --no-cache-dir --upgrade <package>
Иакх
источник
1
Это сработало для меня. Наконец-то была установлена ​​фотоэлемент v0.4 поверх v0.2.1. Пип загружал tar v0.4, но затем он просто установил (или оставил) v0.2.1. Флаги --no-cache-dir и --upgrade наконец сделали это! Спасибо
scibuff
4
Это правильный ответ. По умолчанию Pip хранит кеш соответствующей страницы Pypi в течение 600 секунд. Таким образом, даже если вы удалите локально кешированный пакет, вам придется подождать 10 минут, пока pip получит новую страницу со всеми ссылками на новую версию.
brthornbury
1
Это кажется очень логичным ответом. Тем не менее, pip по-прежнему устанавливает ту же старую версию, даже если версия, которую я вижу, pip searchболее новая.
Mavamaarten
1
Попробуйте проверить, есть ли что-то с virtualenv. Ах версии Python.
Iacchus
25

Благодаря Маркусу Смиту , который проделал потрясающую работу по обслуживанию pip, это было исправлено в версии 1.4 pip, выпущенной 23.07.2013.

Соответствующая информация из журнала изменений для этой версии

Исправлен ряд проблем (# 413, # 709, # 634, # 602 и # 939), связанных с очисткой и отказом от повторного использования каталогов сборки. (Потяните # 865, # 948)

Петр Доброгост
источник
5
Это должно быть отмечено как правильный ответ. Обновите пип так:pip install -U pip
Emil Stenström
2
Это исправление по-прежнему не обращается к pip молча, используя кешированную версию, что можно решить с помощью ответа Якха
Буррито
1
Нет, вроде не исправлено. У меня сейчас та же проблема.
Regis может
17

Я обнаружил здесь известную ошибку в pip, что он не будет проверять версию, если есть каталог сборки с распакованными источниками. Я проверил это в своем проблемном пакете, и после удаления его источников из каталога сборки pip установил требуемую версию.

простолизз
источник
2
Спасибо за информацию. Есть идеи, где мне искать каталог сборки? Я попытался удалить его из Python \ Lib \ site-packages, но результаты были такими же. Я не выполняю команду из места, где существует пакет или что-то еще.
brianmearns 05
@ sh1ftst0rm Я использую virtualenv под linux, а для django-вкусный пирог это было так: «$ VIRTUAL_ENV / build / django-deliciouspie». Попробуйте проверить верхнюю часть каталога Python или просто воспользуйтесь поиском в своей системе. Также вы можете попробовать использовать «pip install -b <путь к настраиваемому каталогу сборки>».
simplelizz 05
1
Похоже, это не моя проблема, я искал повсюду и не смог найти никаких следов пакета или каталога сборки для него в моей системе. Это должно быть какая-то другая ошибка в pip = (. В любом случае хороший совет, я уверен, что это исправит множество людей.
brianmearns
9

Если вы используете pipверсию, которая поставляется с некоторыми пакетами распространения (например, Ubuntu python-pip), вам может потребоваться установить более новую pipверсию:

Обновить pipдо последней версии:

sudo pip install -U pip

В случае "virtualenv" пропустите "sudo":

pip install -U pip

Следующая команда может потребоваться, если ваша оболочка сообщает что-то вроде -bash: /usr/bin/pip: No such file or directoryпосле pipобновления:

hash -d pip

Теперь установите ваш пакет как обычно:

pip install -U foo

или же

pip install foo==package.version.here

рибоз
источник
6

Получил ту же проблему, чтобы обновить pika 0.9.5 до 0.9.8. Единственный рабочий способ был установить из архива: pip install https://pypi.python.org/packages/source/p/pika/pika-0.9.8.tar.gz.

Рут
источник
2
+1 Спасибо, это подсказало мне кое-что важное: pip полагается на исходные дистрибутивы: в моей последней версии я забыл загрузить исходный dist, поэтому, когда я попытался установить, он получил бы только предыдущую версию. Это не решает мою первоначальную проблему, но это полезно знать.
brianmearns
1

В моем случае мне пришлось удалить .pipпапку в моем домашнем каталоге, после чего я смог получить более поздние версии нескольких библиотек. Обратите внимание, что это было на Linux.

pip --version
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
virtualenv --version
15.1.0
NateW
источник
0

Я обнаружил, что если вы используете микроверсии, pip их не распознает. Например, нам не удалось обновить версию 1.9.9.1.

Млисснер
источник
2
может быть , потому , что «1.9.9.1» не SemVer совместимы см semver.org
Тектор
0

В моем случае используемая версия python (3.4) не удовлетворяла требованиям зависимостей Django 2.1 (python> = 3.5).

Альберто Кьюзоле
источник
0

В моем случае я устанавливаю пакет .tar.gz из Artifactory, в который я делаю много обновлений. Чтобы перезаписать мои кешированные файлы Python и всегда загружать / устанавливать последнюю версию, которую я смог запустить:

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

Вы должны увидеть, как это повторно загрузит все необходимые файлы и установит их вместо использования локального кеша.

Cheen
источник
0

В моем случае, кто - то опубликовал последнюю версию пакета с python2, поэтому попытка pip3 installего схватил старую версию , которая была была построена с Python3.

Полезные вещи, которые нужно проверить при отладке:

  • Если pip installутверждает, что не может найти версию, посмотрите, pip searchможно ли ее увидеть.
  • Взгляните на раздел «Загрузить файлы» в репозитории pypi - имена файлов могут указывать на то, что не так (в моем случае я видел, что -py2-там все ясно).
  • Как предлагали другие, попробуйте запустить, pip install --no-cache-dirесли pip не пытается спросить в Интернете, потому что у него уже есть ваш ответ локально.
jarekwg
источник
0

Я спрятал неверсированные файлы на вкладке Git в PyCharm, которые устанавливались, pip install .хотя я не видел их больше нигде.

Мне потребовалось много времени, чтобы найти его, я разместил это в надежде, что это поможет кому-то другому.

Мандера
источник
0

На всякий случай, если у кого-то еще возникнут проблемы с обновлением torchtext (или, возможно, любой другой torchбиблиотеки):

Хотя https://pypi.org/project/torchtext/ заявляет, что вы можете запускать, pip install torchtextмне пришлось установить его аналогично torch, указав --find-linksaka -f:

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

Что меня раздражало, так это то, что PyCharm указал мне на новую версию, но не смог найти ее при попытке перейти на нее. Я предполагаю, что PyCharm использует свой собственный механизм для обнаружения новых версий. Затем, при вызове pipпод капотом, он не нашел новую версию без --find-linksопции.

Тобиас Уманн
источник