Home

Blog

Улучшенное управление пакетов Python

Дональд Стафт, один из основных участников pip, в прошлом году в блоге подробно описал четыре дня трафика PyPi CDN-провайдера. Один из показателей продемонстрировал, что pip используется для 75% установок, использующих PyPi. Инструмент оказался настолько полезным и популярным, что в октябре 2013 года было принято решение о pip будет включен наряду с Python, начиная с версии 3.4 и далее.

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

Запуск последней версии pip

Перед выполнением каких-либо команд, представленных в данном посте убедитесь, что ваша версия pip достаточно современна. На момент написания статьи 1.5.4 являлась последним релизом поддерживаемым Ubuntu, а 1.5.6 была последней версией на GitHub.

 

Если вы работаете с Python 3.4 или выше, то это не проблема, так как pip уже является частью комплекта установки Python.

 

Просмотр всех доступных версий

В pip поддерживается функциональность поиска на уровне имени пакета, но если вы хотите увидеть все версии какого-нибудь пакета, которые доступны из PyPI, можете воспользоваться yolk:

Обновление устаревшего

Поиск устаревших пакетов с помощью PIP некоторое время было возможным:

Но если вы хотите обновить все устаревшие пакеты или выбрать нужные в интерактивном режиме, то вам подойдет инструмент pip-review, который включен в pip-tools.

Например, я установил некоторые старые версии Django и Ansible:

С помощью одной команды я могу обновить их до последней стабильной версии:

Имейте в виду, что pip-review работает только с пакетами, которые следуют схеме версий, описанных в PEP 440. Пакет, который до недавнего времени не следовал этому соглашению был pytz. Он использовал формат <YEAR><Revisioncharacter>, поэтому версии, например, 2013b выглядели для pip-review как бета-версии, а не второй стабильный релиз 2013 года. Начиная с версии 2013.6 они перешли к схеме <YEAR>.<MONTH>, которая прекрасно работает с PEP 440 и pip-review.

Криптографическое обеспечение пакетов

Вы можете указывать номера версий и идентификаторы при замораживании требований к пакетам с помощью pip, но вы не можете точно привязать содержимое пакета к определенному криптографическому хэшу. Если новая версия пакета была выпущена PyPI без увеличения номера версии или была осуществлена атака «человек посередине» между вашим компьютером и PyPI, вы не сможете обнаружить это только при помощи pip.

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

Я взял пары хэшей и пакетов, сгенерированных выше и записал их обратно в requirements.txt:

Теперь я могу просто установить требования через peep и убедиться, что я криптографически использую то же содержимое пакета каждый раз, когда загружаю их.

Графики зависимости

Вы можете просмотреть зависимости пакетов с помощью pip, но если вы хотите увидеть зависимости этих зависимостей, то вам нужно пройти каждый из них по отдельности:

Существует инструмент под названием pipdeptree, который покажет всю родословную зависимостей в вашей среде.

Это может быть полезно в проектах, в которых не сохранились правильно сформированные requirements.txt. Это также полезно для разделения требований разработки от производства.

Проверка на конфликт пакетов

Если вы хотите найти конфликты зависимости между требованиями используйте инструменты check-pip-dependencies и pip-conflict-checker. У обоих проектов низкая активность на GitHub, так что, возможно, стоит перепроверять их работу.

Исключение пакетов

У меня были проблемы с distribute==0.6.4, который появлялся в requirements.txt и с которыми я работал в 2012 и 2013, которые могут вызвать отключение pip, когда он попытался установить distribute. Обычно просто запуская pipfreeze > requirements.txt можно включить его в requirements.txt, с которым я работаю.

Я не мог найти способ добавления пакетов в черный список от имени с помощью pip, так что я воспользовался следующей командой bash:

Удаление ненужных пакетов

Если вы хотите удалить неиспользуемые зависимости из вашей среды, используйте pip-autoremove. Единственное требование — вы должны перечислить требования верхнего уровня, которые вам необходимы:

Разделение требований производства и разработки

Если вы хотите разделить зависимости разработки от производственных систем, то разделите свой requirements.txt на два отдельных файла.

Но если вы хотите запустить pipfreeze, чтобы сохранить обновленные версии пакета он не будет разделять файл требований для производства и разработки. Существует еще один инструмент среди pip-tools под названием pip-dump, который может это сделать.

Я добавил несколько более старых пакетов к моим файлам требований:

Я их установил, обновил до последних версий, а затем сохранил их обратно в соответствующие файлы требований:

Пакеты, которые были в requirements.txt и equirements-dev.txt теперь имеют свои последние номера версий:

Если вы хотите найти возможные проблемы в ваших файлах требований используйте piplint:

Ускорение установки

PyPI использует Fastly в качестве CDN, поэтому загрузки должны быть достаточно последовательными. Это не значит, что процесс установки не может быть ускорен. pip-accel будет кэшировать исходный код и бинарные файлы во время установки, так что они не должны быть загружены/скомпилированы, если вы загружаете ту же версию снова.

Спасибо, что нашли время, чтобы прочитать этот пост.

Comments