Про колеса

  • Tutorial
Многие уже слышали про колеса / 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.
  • +25
  • 13.7k
  • 5
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 5

    +2
    Настроить окружение и собрать, например, numpy/scipy/matplotlib для Windows, для numpy/scipy особенно с поддержкой MKL — это тот ещё квест. А для какого-нибудь PySide вообще Qt будет полдня компилироваться. Наконец-то до них стало доходить, что собирать вообще всё из исходников — это не всегда удобный и разумный путь, поэтому «колёса» и появились.

    По-хорошему сборкой и выкатыванием колёс должны заниматься разработчики пакетов. Колёса должны быть доступны на PyPI для всех платформ.

    Кстати, в последних версиях pip первым делом пытается установить пакеты из колёс и если колёс нет, то ставит из исходников.
      0
      Так а первый раз всеравно компилировать надо и ставить все зависимости
        +1
        Насколько я понимаю, не обязательно. Например, PySide под Windows с версии 1.2.2 ставится из «колёс» и ничего не компилируется, никаких внешних зависимостей не ставится.

        Use pip to install the wheel binary packages


        Note

        Provided binaries are without any other external dependencies. All required Qt libraries, development tools and examples are included.

        pypi.python.org/pypi/PySide#id40
        +1
        Не всё так просто, если брать Win/Mac, то там всё относительно просто, и всё вполне сносно работало ещё со времён появления Python Egg. Проблемы начинаются при попытках собрать что-то под 100500 дистров Linux/*BSD/etc, ибо бинарные пакеты зависят от установленных в систему библиотек.

        Если интересно, то вот мой древнющий пост на эту тему, где всё расписано несколько подробнее.
          0
          .egg не работают с pip. Собственно, основной профит с колес для конечного пользователя пакетов, это именно то, что теперь у него pip install будет сразу ставить бинарные пакеты, если разработчик озаботился таковыми, а не пытаться собрать их.

      Only users with full accounts can post comments. Log in, please.