Классическому pip приближается замена — Pipfile и Pipenv

Не секрет, что в классическом менеджере зависимостей pip есть такие недостатки, как необходимость использования инструмента отдельно от virtualenv или потребность иметь несколько requirements.txt. Файл Pipfile и инструмент Pipenv элегантно решают эти проблемы.

Pipfile — новая альтернатива requirements.txt. Конечно, все привыкли к старому доброму pip, но надо признать, что ему не хватает некоторых возможностей, которые существуют, например, в npm, bundler или cargo. Файл Pipfile позволяет гораздо больше.

Чем Pipfile отличается от requirements.txt?

  1. Синтаксис TOML — позволяет определять более точную конфигурацию.
  2. Группы зависимостей (одна по умолчанию, другая для разработки, третья для дистрибутивов и т. д.), поэтому больше не нужно распределять зависимости по разным файлам.
  3. Pipfile.lock — специальный файл, который связывает версии ваших пакетов и дополнительно обеспечивает некоторую безопасность.

Пример Pipfile

[[source]]
url = 'https://pypi.python.org/simple'
verify_ssl = true
name = 'pypi'

[requires]
python_version = '2.7'

[packages]
requests = { extras = ['socks'] }
records = '>0.5.0'
django = { git = 'https://github.com/django/django.git', ref = '1.11.4', editable = true }
"e682b37" = {file = "https://github.com/divio/django-cms/archive/release/3.4.x.zip"}
"e1839a8" = {path = ".", editable = true}
pywinusb = { version = "*", os_name = "=='nt'", index="pypi"}

[dev-packages]
nose = '*'
unittest2 = {version = ">=1.0,<3.0", markers="python_version < '2.7.9' or (python_version >= '3.0' and python_version < '3.4')"}

Так, сначала определяется источник, который будет использовать pip, затем необходимая версия Python, ваши и dev-пакеты.

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

Pip будет поддерживать эту спецификацию в будущем: pip install -p Pipfile. Но уже сегодня можно использовать новые возможности с помощью инструмента Pipenv. Он напоминает virtualenvwrapper или pyenv, но с функциями pip.

Рабочий процесс с Pipenv

pipenv --three # создаем окружение Python 3
pipenv install flask # устанавливаем зависимости
pipenv install --dev pytest
pipenv shell # задействуем виртуальное окружение
pipenv lock -r > requirements.txt # формируем обычный файл зависимостей

Pipenv управляет зависимостями и добавляет некоторый слой безопасности, используя для каждого пакета хэш-код. В качестве бонуса — поддерживает загрузку .env-файлов и позволяет строить графики зависимостей (см. команду pipenv graph).

На данный момент Pipenv является официально рекомендуемым менеджером зависимостей для Python. Что вы о нем думаете?