Проверьте, актуальны ли требования

Я использую pip файлы требований для хранения списка зависимостей.

Я также стараюсь следовать передовым методам управления зависимостями и предоставлять точные версии пакетов в файле требований. Например:

Django==1.5.1
lxml==3.0

Вопрос в следующем: есть ли способ узнать, что в индексе пакетов Python доступны более новые версии пакетов для пакетов, перечисленных внутри requirements.txt?

Для этого конкретного примера в настоящее время последними доступными версиями являются 1.6.2 и 3.3.4 для Django и lxml соответственно.

Я пробовал pip install --upgrade -r requirements.txt, но он говорит, что все обновлено:

$ pip install --upgrade -r requirements.txt 
Requirement already up-to-date: Django==1.5.1 ...

Обратите внимание, что на данный момент я не хочу запускать фактическое обновление — я просто хочу посмотреть, есть ли какие-либо доступные обновления.


person alecxe    schedule 08.04.2014    source источник


Ответы (4)


В Pip эта функция встроена. Предполагая, что вы находитесь внутри своего типа virtualenv:

$ pip list --outdated
psycopg2 (Current: 2.5.1 Latest: 2.5.2)
requests (Current: 2.2.0 Latest: 2.2.1)

$ pip install -U psycopg2 requests

После этого будут загружены и установлены новые версии psycopg2 и запросов. Затем:

$ pip freeze > requirements.txt

Готово. Это не одна команда, но преимущество в том, что вам не нужны никакие внешние зависимости.

person Max Tepkeev    schedule 16.04.2014
comment
Это правильный ответ. Другие удобно знать, но это не требует дополнительных инструментов. - person 0atman; 09.07.2015
comment
pip list --outdated работает медленно для многих установленных пакетов. И pip search <package> не очень полезно - выдает версии для разработчиков как последние и дает слишком много мусора. Есть ли команда для проверки обновлений только одного/нескольких пакетов (что на самом деле должно произойти в pip install -U), таким образом, что-то вроде симуляции? - person kxr; 03.04.2017
comment
@kxr Только что проверил документы pip, чтобы убедиться, и на сегодняшний день я не думаю, что это возможно. - person Max Tepkeev; 03.04.2017

Только что нашел пакет python специально для задачи — piprot со следующим слоганом:

How rotten are your requirements?

Работать с ним очень просто:

$ piprot requirements.txt 
Django (1.5.1) is 315 days out of date. Latest is 1.6.2
lxml (3.0) is 542 days out of date. Latest is 3.3.4
Your requirements are 857 days out of date

Также вы можете «направить» команду pip freeze в piprot, чтобы она действительно могла проверить, насколько гнилыми являются пакеты, установленные в вашей песочнице/виртуальной среде:

pip freeze | piprot

Надеюсь, что это поможет кому-то в будущем.

person alecxe    schedule 08.04.2014
comment
Должен любить, как пипрот суммирует все дни в конце. - person tobych; 03.09.2015
comment
@TobyChampion да, иногда это угнетает, особенно если вы знаете, что не можете обновить что-то, выпущенное более 1 года назад :) - person alecxe; 03.09.2015
comment
пип заморозить | piprot у меня не работает: piprot (0.9.6) и pip (1.5.6) в любом случае piprot requirements.txt работает очень хорошо - person yucer; 10.03.2016
comment
Больше не поддерживается :( - person Sohaib Farooqi; 28.04.2021

Поскольку вы упомянули, что вам нравится следовать лучшим практикам, я предполагаю, что вы тоже используете virtualenv, верно? Предполагая, что это так, и поскольку вы уже закрепляете свои пакеты, существует инструмент под названием pip-tools, которые вы можете запускать на виртуальной среде для проверки обновлений.

Есть и обратная сторона, и почему я упомянул об использовании virtualenv.

[инструмент] проверяет PyPI и сообщает о доступных обновлениях. Он использует список установленных пакетов для проверки обновлений, не использует файл requirements.txt.

Если вы запустите его в своей виртуальной среде, вы можете легко увидеть, какие пакеты имеют обновления, доступные для вашей текущей активной среды. Однако, если вы не используете virtualenv, вероятно, не лучше запускать его против системы, поскольку другие ваши проекты могут зависеть от разных версий (или могут не работать с обновленной версией, даже если все они в настоящее время работают).

Судя по предоставленной документации, использование простое. pip-review показывает, какие обновления доступны, но не устанавливает их.

$ pip-review
requests==0.13.4 available (you have 0.13.2)
redis==2.4.13 available (you have 2.4.9)
rq==0.3.2 available (you have 0.3.0)

Если вы хотите установить также автоматически, этот инструмент тоже справится: $ pip-review --auto. Существует также переключатель --interactive, который можно использовать для выборочного обновления пакетов.

Как только все это будет сделано, pip-tools предоставит возможность обновить ваш файл requirements.txt с помощью новейших версий: pip-dump. Опять же, это работает с текущей активной средой, поэтому рекомендуется использовать его в виртуальной среде.

Установку проекта можно осуществить через pip install pip-tools.

Примечание автора: я использовал это для небольших проектов Django и был очень доволен. Одно замечание: если вы установите pip-tools в свою виртуальную среду, то при запуске pip-dump вы обнаружите, что он добавляется в ваш файл requirements.txt. Поскольку мои проекты небольшие, я всегда удалял эту строку вручную. Если у вас есть какой-либо скрипт сборки, вы можете автоматически удалить его перед развертыванием.

person Andy♦    schedule 08.04.2014
comment
pip-tools определенно пакет, который я собираюсь использовать, спасибо, что указали на это. Также проверьте ответ, который я предоставил: насколько я понимаю, pip-tools работает с вашей виртуальной средой, но piprot использует подход только для требований, верно? - person alecxe; 09.04.2014
comment
@alecxe Вот как это выглядит. Я не видел piprot раньше. Это тоже выглядит очень интересно. Спасибо, что указали на это. - person Andy♦; 09.04.2014
comment
Только что установил последнюю версию pip-tools, но в моем пути нет файла pip-review. Что-то изменилось? - person Vadim Kotov; 19.01.2017
comment
Не знаю, то же ли это (у меня тоже есть ваша проблема @vadim, но я нашел pip-review здесь: github.com/jgonggrijp/pip-review - person thorwhalen; 21.10.2019
comment
pip-review был перенесен в другой проект, о чем @thorwhalen уже упоминал и ссылался. Обсуждение того, почему здесь - person RoachLord; 13.11.2020

Вы можете просто сделать что-то подобное в своей среде (виртуальной или не виртуальной):

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
person Rico    schedule 08.04.2014