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 также проверяет, используются ли корректные версии зависимостей.
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.
Для Linux и MacOS есть альтернативный способ установки:
После установки, вы можете фактически забыть о pip — pipenv по сути заменяет pip и virtualenv.
Пример использования
Рассмотрим простой пример использования pipenv.
Создаем виртуальную среду
Для инициализации виртуальной среды Python 3, выполните команду:
Если виртуальной среды еще не существует, она будет создана.
💭 Также вы можете принудительно создать среду Python 3 или Python 2. Для этого нужно выполнить команды pipenv —three или pipenv —two .
Устанавливаем пакеты
Далее можно установить сторонний пакет. Существует 3 варианта установки:
Вариант #1 . Указываем пакет, который нужно установить
Установится последняя версия пакета. При этом в Pipfile добавится запись scrapy = «*»
Вариант #2 . Не указываем пакет (установка пакетов из Pipfile)
Установятся все пакеты из Pipfile и обновится Pipfile.lock
Вариант #3 . Не указываем пакет (установка пакетов из Pipfile.lock)
Установятся все пакеты из Pipfile.lock
Запускаем скрипты
Запустить python-скрипты можно несколькими способами:
Способ #1 . Активируем виртуальное окружение командой pipenv shell , далее выполняем python script-name.py
Способ #2 . Запустить скрипт сразу внутри оболочки virtualenv можно командой:
pipenv run python script-name.py
Настройка pipenv в PyCharm
Процесс настройки pipenv в PyCharm:
- В настройках откройте вкладку » Project Interpreter » — File > Settings > Project: ProjectName > Project Interpreter.
- Нажмите на шестеренку рядом с выпадающим списком и выберите » Add «.
- В списке слева выберите » Pipenv Environment «.
- Далее вы можете создать новое окружение » 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 — удаление всех установленных пакетов в виртуальной среде.
- 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 . Простой способ использовать 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 —envs :
Официальная документация по конфигурированию pipenv — » Configuration With Environment Variables «. Расшифровка некоторых переменных тут .
Стоит ли использовать Pipenv?
Определенно да! 🎉 Pipenv сведет всю работу по управлению пакетами и виртуальным окружением в одну консоль, решит проблему с версионированием пакетов и добавит новый, весьма приятный функционал.