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, путь к файлу и другую информацию.
Пример файла Pipfile
:
[[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
также проверяет, используются ли корректные версии зависимостей.
Пример файла 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 3 или 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:
- В настройках откройте вкладку "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
— удаление всех установленных пакетов в виртуальной среде.
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. Простой способ использовать 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 сведет всю работу по управлению пакетами и виртуальным окружением в одну консоль, решит проблему с версионированием пакетов и добавит новый, весьма приятный функционал.
Примеры "неудобств" высосаны из пальца, если программисту слишком сложен файл
requirements.txt
и непросто совладать сvirtualenv
, то ему следует заняться чем-то другим (вести разрекламированные курсы или котлеты для бургеров там переворачивать).На деле имеем раздутый нечеловекочитаемый
json-блоб
иPipfile
более сложный, чемrequirements.txt
.Спасибо за комментарий! Никто не говорит что файл
requirements.txt
слишком сложный. Про совладание сvirtualenv
тоже ни слова. Перечитайте еще раз статью повнимательнее 😉