Александр Кошелев
Александр Кошелев Python-разработчик

Что такое pip?

Pip это альтернатива easy_install, а как говорят сами разработчики - замена.

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

Pip может поставить любой пакет собранный при помощи distutils. Причем только source-пакет - никаких бинарных яиц ему и прочих setuptools’овых прибамбасов.

Эта концептуальная простота во многом помогла pip постепенно выйти на уровень широко используемого инструмента в питон-сообществе. Благо и пользоваться им максимально просто:

# pip install wna

где wna - это некий пакет (для примера я возьму код своего блога).

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

Помимо уже собранных source-пакетов pip может брать исходники пакетов из систем контроля версий. Поддерживаются subversion, mercurial, git, bazaar. Делая checkout и устанавливая через python setup.py с ключом devel, дает возможность иметь в папке /src/packet_name/ исходный код и при необходимости редактировать его.

# pip install -e hg+http://bitbucket.org/daevaorn/turbion/#egg=turbion

Где egg=turbion говорит pip чтобы он сделал checkout в /src/turbion/.

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

Для меня одной из самых востребованных фичей pip является возможность задать внешние дополнительные пакеты/зависимости при установки того или иного базового пакета. Для этого существует так называемые requirements files. Это обычный текстовый файл на каждой строчке которого находятся название пакетов и опционально версия или путь до репозитория. Вот пример такого файла, который я использую для своего блога:

-e svn+http://code.djangoproject.com/svn/django/trunk#egg=Django
-e svn+http://django-filebrowser.googlecode.com/svn/trunk#egg=Filebrowser
Djapian==2.2.3
django-dbtemplates
postmarkup
-e hg+https://daevaorn@bitbucket.org/daevaorn/django-composition/#egg=django-composition
-e hg+https://daevaorn@bitbucket.org/daevaorn/django-shoes/#egg=django-shoes

Устанавливая теперь свой блог, я пишу:

# pip install wna -r requirements.txt

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

Конечно в большинстве случает нужен дефолтный вариант зависимостей, который будет жестоко прописан в самом setup.py, но и иметь более гибкую систему установки сторонних сущностей тоже бывает полезно.

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

Поскольку Ян Бикинг автор как pip так и virtualenv, то вполне естественно что они могут взаимодействовать. Выражается это в том, что pip может ставить пакеты в указанное окружение, создав предварительно, если его не существует. Для этого используется ключ -E:

# pip install wna -E ./blogenv

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

В дополнение pip ещё предлагает так называемый фризинг (freezing) - это когда он создает на основе текущих установленных пакетов в системе специальный requirements.txt файл. Который потом можно использовать для “повторения” текущей установки где-то ещё:

# pip freeze requirements.txt
# cd где-то_ещё
# pip install requirements.txt

Ещё более радикальная возможность “взять с собой” - это создать бандл (bundle). Бандл это архив, который содержит установленные пакеты в системе, который тоже можно притащить в другое место и, распаковав, получить то же самый набор пакетов, но уже в новой системе/окружении:

# pip bundle my.pybundle Django markdown2 pytils
# cd где-то_ещё
# pip install my.pybundle

Что мне ещё нравится в pip это предсказуемость интерфейса использования, к которому быстро привыкаешь и начинаешь достаточно быстро пользоваться.

Так что всем всячески рекомендую использовать именно pip для установки питонячих пакетов.

comments powered by Disqus