
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тоже ни слова. Перечитайте еще раз статью повнимательнее 😉