Python на колесах

Wheels в питоне настолько старая фича что про нее все забыли примерно в 2005 году. Так что это такое и почему я про это решил напомнить вам.

Основной формат распространения приложений в питоне - это исходные файлы. Тем не менее существуют и бинарные форматы. Например egg. Python eggs это обычные zip-архивы, содержащие python-пакет и необходимые метаданные. Это не было идеальным решение и в один прекрасный момент на смену ему пришел Python wheels. Который попытался решить основные проблемы присущие egg. Понятно что все решить не смог и кое что пришлось унаследовать от предшественника. К примеру бинарные ‘колёса’ нельзя загружать на PyPI как несовместимые с различными системами. Или проще говоря бинарные wheel’ы по сути можно использовать только в своих собственных однородных инфраструктурах. Ключевое слово однородных. А как мы знаем даже в рамках одной команды однородности мало.

Казалось бы все печально, но не так как могло показаться. Мы живем в эпоху докеров, а докеры это как раз та самая однородная среда. А это значит, что если мы используем docker’ы в своем девелопмент процессах, то мы можем и wheel’ы использовать в полном объеме. А это в первую очередь поможет нам ускорить сборку приложений и в некоторых случаях даже более чем в сотни раз.

Создаем архив wheel пакетов

И так, у нас есть типичный Python проект с файлом requirements.txt содержащим зависимости.

# Core
cassandra-driver==3.17.0
aiohttp==3.5.4

# Supplement
cchardet==2.1.4
aiodns==2.0.0
uvloop==0.12.2

Для начала нам необходимо установить пакеты. Действуем обычным способом:

$ pip install -r requirements.txt

Далее нам необходимо сгенерировать архив wheel для всех наших пакетов и их зависимостей. И сложить их куда нибудь к нам в проект.

$ mkdir wheels
$ pip wheel -w wheels/ -r requirements.txt 

Теперь когда в директории wheels есть все необходимые пакеты для установки всех зависимостей системы можем просто выполнить:

$ pip install --no-index -f wheels/ -r requirements.txt

В результате время установки пакетов из локального архива ускорилось на порядки.