Pipenv - современный менеджер зависимостей для Python-проектов

Pipenv – менеджер зависимостей для Python-проектов. С его помощью можно создавать виртуальные среды и управлять зависимостями приложений. Pipenv решает ряд проблем, которые возникали при использовании pip, virtualenv и requirements.txt.

Данный инструмент аналогичен npm у NodeJS, или composer у PHP, и является официально рекомендуемым менеджером зависимостей для Python. Подробнее о том, кому он будет полезен и как им пользоваться, рассмотрим ниже.

Чем хорош Pipenv?

Рано или поздно, каждый разработчик сталкивается с проблемой контроля версий пакетов pip и настройкой виртуального окружения. С помощью Pipenv вы можете:

  • Управлять окружениями (env)
  • Управлять пакетами: устанавливать, удалять, обновлять (pip)
  • Устанавливать детерминированный набор пакетов (Pipfile.lock)

Можно забыть про pip и virtualenv

Вам больше не нужно использовать pip и virtualenv по отдельности. В pipenv этот функционал реализован "из коробки"

Requirements.txt больше не нужен

Для своей работы менеджер использует 2 файла: Pipfile (по сути замена requirements.txt) и Pipfile.lock (связывает версии пакетов, тем самым обеспечивая дополнительную безопасность).

Когда вы запускаете проект с Pipenv, он автоматически создает виртуальную среду для текущего проекта, даже если вы еще не используете ее. Pipenv управляет зависимостями, отказавшись от привычного requirements.txt, и заменяя его на новый документ под названием Pipfile. Когда вы устанавливаете библиотеку с помощью Pipenv, файл Pipfile для проекта автоматически обновляется с указанием сведений об этой установке, включая информацию о версии, расположение хранилища Git, путь к файлу и другую информацию. Пример:

[[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] [packages] questionary = "*" [requires] python_version = "3.7"

Ваше приложение может зависеть от конкретной версии библиотеки, а эта библиотека может зависеть от конкретной версии другой библиотеки. Если производить настройку вручную, во всем этом очень просто запутаться 🤷. Pipenv создан, чтобы облегчить эту задачу. Он отслеживает дерево взаимозависимостей вашего приложения в файле с именем Pipfile.lock В свою очередь, Pipfile.lock также проверяет, используются ли корректные версии зависимостей. Пример:

{ "_meta": { "hash": { "sha256": "bb84bcf0496484d8725eb675984e488d0..." }, "pipfile-spec": 6, "requires": { "python_version": "3.7" }, "sources": [ { "name": "pypi", "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { "questionary": { "hashes": [ "sha256:7d4f98c9e5a1c0cd7e45a2c13959d5df9de...", "sha256:87ffc9dab940ec962c54fe2eec3a4eecb10..." ], "index": "pypi", "version": "==1.4.0" } }, "develop": {} }

Pipenv удобен, когда над проектом работают несколько разработчиков. Рассмотрим простой пример – компания ведет разработку своего корпоративного сайта. Мария работает над вкладкой "Отчеты", Иван – над вкладкой "Чат".

  • Для того чтобы отчеты создавались быстрее, Мария решает обновить некоторые питон-библиотеки.
  • В течение 2-х дней она разрабатывает новый функционал для отчетов.
  • Мария фиксирует изменения в git репозитории, но забывает запустить pip freeze. Файл requirements.txt остается в репозитории со старыми версиями библиотек.
  • Иван затягивает из репозитория изменения Марии, и внезапно выясняется, что его вкладка "Чат" стала выпадать с ошибкой.
  • Помимо этого, CI сборка тоже сломалась 😢

Требуется время, чтобы понять, что проблема в файле requirements.txt, где находятся старые версии библиотек.

Если бы Иван и Мария использовали Pipenv, Pipfile был бы автоматически обновлен и включен в коммит Марии. Они бы сэкономили время и завершили свой продукт быстрее. Вот что делает Pipenv таким важным.

Возможность создавать собственные шорткаты

Pipenv позволяет создавать собственные шорткаты в секции [scripts] файла Pipfile:

[scripts] print_hello = "python -c \"print('Hello')\""

Теперь в консоли вы можете вызвать шорткат командой pipenv run print_hello

Автоматизация рутинных задач

Больше не придется тратить время на выполнение рутинных задач, выискивая причины отсутствия синхронизации и возникновения ошибок в версиях. Всю рутинную работу pipenv берет на себя:

  • автоматически генерирует Pipfile
  • автоматически удаляет/добавляет записи в Pipfile при установке/удалении пакетов;
  • автоматически создает virtualenv;
  • автоматически подгружает .env файлы и т.д.

Установка

Самый простой вариант – установка с помощью pip.

pip install pipenv

Для Linux и MacOS есть альтернативный способ установки:

Для MacOS:

brew install pipenv

Для Debian:

sudo apt install pipenv

Для Fedora:

sudo dnf install pipenv

Для FreeBSD:

pkg install py36-pipenv

После установки, вы можете фактически забыть о pip – pipenv по сути заменяет pip и virtualenv.

Пример использования

Рассмотрим простой пример использования pipenv.

Создаем виртуальную среду

Для инициализации виртуальной среды Python 3, выполните команду:

pipenv shell

Если виртуальной среды еще не существует, она будет создана. Также вы можете принудительно создать среду Python 2 или Python 2. Для этого нужно выполнить команды pipenv --three или pipenv --two.

Устанавливаем пакеты

Далее можно установить сторонний пакет. Существует 3 варианта установки:

Вариант #1. Указываем пакет, который нужно установить

pipenv install scrapy

Установится последняя версия пакета. При этом в Pipfile добавится запись scrapy = "*"

Вариант #2. Не указываем пакет (установка пакетов из Pipfile)

pipenv install

Установятся все пакеты из Pipfile и обновится Pipfile.lock

Вариант #3. Не указываем пакет (установка пакетов из Pipfile.lock)

pipenv sync

Установятся все пакеты из Pipfile.lock

Запускаем скрипты

Запустить python-скрипты можно несколькими способами:

Способ #1. Активируем виртуальное окружение командой pipenv shell, далее выполняем python script-name.py

Способ #2. Запустить скрипт сразу внутри оболочки virtualenv можно командой:

pipenv run python script-name.py

Настройка pipenv в PyCharm

Процесс настройки pipenv в PyCharm:

  1. В настройках откройте вкладку "Project Interpreter" - File > Settings > Project: ProjectName > Project Interpreter.
  2. Нажмите на шестеренку рядом с выпадающим списком и выберите "Add".
  3. В списке слева выберите "Pipenv Environment".
  4. Далее вы можете создать новое окружение "New environment" или использовать существующее "Existing environment".

После того, как все шаги выполнены, для текущего проекта устанавливается новая среда pipenv и устанавливаются пакеты, перечисленные в Pipfile.

Если вы открываете какой-либо проект с добавленным файлом Pipfile, но в нем не настроен интерпретатор, PyCharm предложит вам использовать среду Pipenv. Если вы выберете эту опцию, PyCharm автоматически установит для вас pipenv.

Если PyCharm покажет сообщение об ошибке: Pipenv executable is not found, введите правильный путь к исполняемому файлу в настройках "Pipenv Environment", например: C:\Users\jetbrains\AppData\Roaming\Python\Python37\Scripts\ pipenv.exe (Windows)

Команды pipenv

Общие:

  • pipenv shell - активация виртуального окружения;
  • exit - выход из виртуального окружения;
  • pipenv check - проверка на наличие уязвимостей безопасности;

Управление пакетами:

  • pipenv install - установка всех пакетов из Pipfile
  • pipenv install scrapy==1.8.0 - установит фиксированную версию пакета;
  • pipenv install selenium --dev - установит selenium как пакет только для разработки;
  • pipenv install --system - установка зависимостей в родительскую систему;
  • pipenv uninstall scrapy - удаление пакета;
  • pipenv uninstall --all - удаление всех установленных пакетов в виртуальной среде;

Pipfile.lock:

  • pipenv lock - генерация Pipfile.lock
  • pipenv sync - установка пакетов из Pipfile.lock
  • pipenv clean - удаление из virtualenv всех пакетов, которых нет в Pipfile.lock

Информация:

  • pipenv --where - путь до текущий проект;
  • pipenv --venv - путь до virtualenv;
  • pipenv --py - путь до интерпретатора;
  • pipenv graph - отображение графа зависимостей;

Pipenv и Docker

Способ #1. Cамый простой способ использовать pipenv в сборке Docker - экспортировать файл require.txt. Вы можете сделать это вне сборки Docker, и просто передать полученный файл в систему управления версиями, а затем использовать Dockerfile. Выполнить это можно следующим образом:

pipenv lock --requirements > requirements.txt

Плюс в том, что Dockerfile не нужно ничего знать о pipenv. Иначе, это потребовало бы обновлять файл require.txt при каждом обновлении Pipfile.lock

В качестве альтернативы можно выполнить экспорт в самой сборке:

FROM python:3.7 RUN pip install pipenv COPY Pipfile* /tmp RUN cd /tmp && pipenv lock --requirements > requirements.txt RUN pip install -r /tmp/requirements.txt COPY . /tmp/myapp RUN pip install /tmp/myapp CMD flask run exampleapp:app

Способ #2. Второй вариант связан с использованием дополнительных флагов при установке пакетов.

pipenv install --deploy --system

--deploy - pipenv выдаст ошибку если Pipfile.lock устарел, вместо того, чтобы сгенерировать новый Pipfile.lock файл.

--system - устанавливать зависимости в родительскую систему.

Рассмотрим пример Dockerfile для развертывания Flask приложения:

FROM python:3.7 RUN pip3 install pipenv WORKDIR /usr/src/app COPY Pipfile ./ COPY Pipfile.lock ./ RUN set -ex && pipenv install --deploy --system COPY . . EXPOSE 8000 CMD [ "gunicorn", "-b0.0.0.0:8000", "wsgi:app" ]

Конфигурирование pipenv

Pipenv дает возможность конфигурировать свое поведение с помощью переменных окружения (Environment Variables). Просто создайте переменную и pipenv обнаружит её. Вот некоторые их них:

  • PIPENV_VENV_IN_PROJECT - создаст виртуальное окружение .venv в папке с проектом.
  • PIPENV_YES - автоматически соглашаться со всеми диалогами
  • PIPENV_DONT_LOAD_ENV - не загружать файл .env
  • PIPENV_INSTALL_TIMEOUT - максимальное время ожидания установки пакета (сек.)
  • PIPENV_MAX_SUBPROCESS - количество подпроцессов, используемых во время установки
  • PIPENV_PIPFILE - путь до файла Pipfile

Полный список переменных можно посмотреть в официальной документации pipenv, в разделе "Configuration With Environment Variables".

Стоит ли использовать Pipenv?

Определенно да! 🎉 Pipenv сведет всю работу по управлению пакетами и виртуальным окружением в одну консоль, решит проблему с версионированием пакетов и добавит новый, весьма приятный функционал.

😭
😕
😃
😍