python

Про колеса

  • четверг, 19 июня 2014 г. в 03:11:02
http://habrahabr.ru/post/226589/

Многие уже слышали про колеса / wheels; рассказывать про них подробно не буду — на хабре были хорошие статьи. Опишу пошагово один (очевидный) способ использования колес на машине разработчика.

Все, кто устанавливал пакеты вроде numpy или scipy через pip знают, что это долго: компиляция может и десять минут занять, и двадцать, и тридцать. Среду для компиляции-то можно настроить (ну по крайней мере под mac и linux это не так сложно), но устанавливать такие зависимости в каждый virtualenv — то еще удовольствие. Можно, конечно, чай попить. Или виртуаленвы не использовать / использовать один общий.

Колеса помогают решить проблему долгой установки. Суть такая — пакет собирается/компилируется только один раз, затем установка выполняется распаковкой архива со скомпилированными файлами. Итак, по шагам:

1. Прописываем в ~/.pip/pip.conf путь к папке, где будут лежать колеса:

[global]
wheel-dir=/Users/kmike/.wheels
find-links=/Users/kmike/.wheels
; папка /Users/kmike/.wheels должна существовать - pip ее сам не создаст

Если файла ~/.pip/pip.conf нет, то его можно создать. Под Windows правильный файл другой — %HOME%\pip\pip.ini.

2. Устанавливаем пакет wheel, который нужен для сборки колес (для установки колес он уже не нужен):

$ pip install wheel

3. Собираем колеса для всех своих часто (и нечасто) используемых зависимостей, например

$ pip wheel numpy lxml Pillow

Выполнять эту команду можно хоть из виртуаленва, хоть нет, без разницы. Колеса выкатятся в папку, указанную в pip.conf.

4. Благодаря нашему pip.conf команда «pip install foo» теперь будет проверять, нет ли для данной версии python уже готового колеса с нужной версией пакета. Если есть, то установка будет практически мгновенной. Теперь можно создавать на каждый чих виртуаленвы и ставить туда scipy/numpy и т.д.

TL;DR Хотите поставить пакет — вместо «pip install foo» пишите в первый раз «pip wheel foo; pip install foo», чтоб дальше команда «pip install foo» выполнялась мгновенно. Угу, кэп!

Замечания:

1. Интересно, можно ли в pip сделать это поведение дефолтным (сначала закешировать колесо, потом установить пакет), чтоб писать одну команду вместо двух.
2. Пример с numpy — так себе, т.к. для numpy==1.8.1 под OS X колеса есть сразу на pypi. Если используете стоковый Python (а не, например, собранный через brew), то «pip install numpy==1.8.1» под маком должно и так быстро сработать — никакой компиляции.
3. Для всего этого требуется более-менее свежий pip.
4. По сравнению со способом devpi (описанным по ссылке в начале статьи) возможностей поменьше, но зато проще все получается — папка с файлами, три строчки в конфиге, никаких серверов.
5. Предполагается, что pip install foo уже работает. Проблему отсутствия компилятора фортрана при сборке scipy локальный кеш колес не решит.
6. «pip wheel numpy scipy» может не сработать, т.к. scipy требует установленного numpy для компиляции. Правильная последовательность — «pip wheel numpy; pip install numpy; pip wheel scipy».
7. Чтобы pip совсем не лез в интернет, а ставил все только из локальной папки, можно команде pip install указывать опцию --no-index.
8. Установка из колес может быть заметно быстрее даже для чисто питоньих пакетов.
9. Вся информация есть в документации к pip.