Заметка о Pipenv
Pipenv - довольно простой инструмент, позволяющий эффективно управлять пакетами. Он настолько прост, что я сомневался, стоит ли он отдельной статьи, однако чем больше я в него погружался, тем больше возможностей открывал, и некоторые из них оказались не столь очевидными, какими казались с самого начала
Что такое pipenv?
Даже если вы никогда не использовали Pipenv, вероятнее всего, он был у вас на слуху, и, вероятно, этому "слуху" вы не уделили должного внимания. Если кратко, то Pipenv - это пакетный менеджер, с помощью которого можно ловко управлять пакетами вашего проекта. Под капотом он использует всем нам знакомый virtualenv. Но зачем он нужен?
Зачем нужен pipenv?
Ведь pip и так позволяет устанавливать и удалять пакеты...
Однако возможности pipenv гораздо шире, чем у него. Pipenv можно сравнить с такими пакетными менеджерами, как npm, pnpm или yarn из мира nodejs. Python разработчики, познавшие их в "бою", полагаю, больше не могли удовлетворяться ограничениями экосистемы пайтона, и создали pipenv.
Какие же возможности открывает разработчику pipenv, которых нет в pip?
- aвтоматическое создание и активация виртуального окружения
- разделение зависимостей на development и production
- построение графа зависимостей между пакетами
- удобное переключение между версиями python
К слову, в мире node.js пакетный менеджер npm обладал всеми этими возможностями уже из коробки c самого начала. А pipenv увидел свет как отдельный пакет относительно недавно (в 2017 году). Хорошо это или плохо, судить вам, а мы перейдем к практике:
Основные команды:
- pipenv --python [3.?] - создать виртуальное окружение для конкретной версии python (работает и на Windows тоже, но все версии, которые вы указываете, должны быть уже предустановлена в систему)
- pipenv shell [--python 3.6] - создать либо войти в виртуальное окружение pipenv
- pipenv --where - показать месторасположение файла Pipenv
- pipenv --venv - узнать местоположение виртуального окружения на хост-машине
- pipenv install [--skip-lock] - установить все пакеты из Pipfile
- pipenv install some_pack -d - установка нового пакета в список пакетов для разработки
- pipenv install -r dev-requirements.txt --dev - установить dev dependencies
- pipenv lock -r [-d] [--keep-outdated] > requirements.txt - генерация requirements.txt. Работает не всегда хорошо, альтернативные варианты:
- обычный pip freeze > requirements.txt
- pipenv lock --requirements > requirements.txt
- pipenv run pip freeze > requirements.txt
- pipenv lock [--requirements] - должна создать Pipfile.lock (может работать не стабильно)
- pipenv install --ignore-pipfile - установка зависимостей непосредственно из Pipfile.lock
- pipenv graph - показать дерево зависимостей
Особенности:
В случае если внутри виртуального окружения начинает работать глобальный pip, советую обновить глобальный virtualenv и перезапустить виртуальное окружение. Так же в случае некорректной работы, вероятно, стоит попробовать сменить терминал (например, conemu на cmd или наоборот).
К слову сказать, у pipenv есть еще один недостаток - он не очень быстрый. И в мире python есть еще один инструмент со подобным функционалом (poetry), в котором разработчики сделали упор на перфоманс. Однако, этот инструмент плохо поддерживается в экосистеме Windows (если вы используете ее в разработке, не стоит делать на него ставки)
Полезные ссылки по теме: