Управление средами в Python с помощью direnv и pyenv

Spread the love

Оригинальная статья: Leandro CofreManaging Python Environments with direnv and pyenv

Введение

Как разработчики Python, большинство из нас знакомы с виртуальными средами. Первое, что мы делаем при работе над новым проектом, — это создаем виртуальную среду под проект. Для этой цели мы обычно используем virtualenv или venv .

Каждый проект, над которым мы работаем, использует разные пакеты и может даже быть совместим только с одной версией Python.

Выполнение чего-либо постоянного всегда требует автоматизации. В этой статье мы рассмотрим, как direnv и pyenv могут помочь нам в этом.

Как примечание, некоторые современные IDE уже автоматизировали этот процесс. Например, PyCharm создаст виртуальную среду при инициализации проекта:

PyCharm's automated python environment management

Хотя автоматизация IDE всех этих шагов является большим преимуществом, вы должны владеть более универсальным решение независимым от IDE.

Проблемы virtualenv

Представьте, что мы нашли проект на GitHub и хотели бы поиграться с ним. Pyweather — это простой скрипт, который запрашивает расширенный прогноз погоды для нашего местоположения и печатает его на терминале.

Вот шаги, которые мы должны предпринять, чтобы попробовать скрипт на своей машине:

$ git clone https://github.com/lcofre/pyweather.git
$ cd pyweather

Затем нам нужно создать виртуальную среду и установить все пакеты, которые использует скрипт:

$ virtualenv --python=python3 env
$ source env/bin/activate
(env) $ pip install requirements.txt

И только тогда мы можем выполнить скрипт:

(env) $ ./pyweather.py	

Мы создали виртуальную среду и сохранили ее в корневой папке нашего проекта. Находясь в этой папке, мы должны еще активировать среду с помощью команды source.

Когда мы закончим работу, нам нужно покинуть виртуальную среду, выполнив deactivate:

(env) $ deactivate

Все эти шаги являются нашей ответственностью. И при большом количестве проектов во всем этом легко запутаться и когда нибудь что нибудь забыть. Сколько раз вы забывали активировать среду и случайно устанавливали пакеты глобально!

Давайте посмотрим, как direnv поможет нам автоматизировать этот процесс.

direnv

direnv был сделан главным образом для загрузки переменных среды, в зависимости от текущего каталога, и имеет расширение для многих оболочек.

В этом примере мы будем использовать bash, но direnv также поддерживает много других оболочек. И что более важно для нас, он позволяет нам управлять виртуальными средами Python (Python Virtual Environments).

Для его установки нужно запустить установщик bash, который они предоставляют. Мы могли бы использовать менеджер пакетов нашего дистрибутива, но установщик bash обеспечит установку последней доступной версии:

$ curl -sfL https://direnv.net/install.sh | bash

Теперь нам нужно подключить direnv к bash. Для этого отредактируем ~/.bashrc и затем перезагрузим его:

$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ source ~/.bashrc

Таким образом, direnv свяжется с оболочкой и будет выполняться всегда перед каждым запуском оболочки. Мы никогда не заметим, что он будет работать в фоне.

direnv проверит, нужно ли что-то загружать в текущую папку. Он проверяет наличие файла с именем .envrc, с инструкциями о том, что должно быть загружено.

Чтобы загрузить виртуальную среду Python, нужно запустить команду layout, а и указать нужную версию Python:

$ echo 'layout python' > .envrc

Или, если мы хотим использовать Python 3:

$ echo 'layout python3' > .envrc

Запуск этих команд скажет direnv искать исполняемый файл python или python3 по систему пути.

Как только мы создадим файл .envrc, нас предупредят, что нам нужно разрешить direnv доступ к этой папке. Давайте сделаем это прямо сейчас:

$ direnv allow
direnv: loading .envrc
...
New python executable in /home/myuser/untitled/.direnv/python-3.6.9/bin/python3
...
Installing setuptools, pkg_resources, pip, wheel...direnv:
done.
direnv: export +VIRTUAL_ENV ~PATH

Как мы увидим в результате, будет создана новая виртуальная среда. Приглашение (prompt) не изменяется, поэтому мы не увидим название среды, написанное в начале командной строки.

Теперь мы можем установить нужные нам пакеты, как мы это делаем обычно:

$ pip install -r requirements.txt

direnv будет молча активировать среду в фоновом режиме. Всякий раз, когда мы выходим из каталога, среда будет деактивирована:

$ cd ..
direnv: unloading

Если нам нужно использовать любую версию Python, установленную в системе, то direnv — это все, что нам нужно.

Давайте теперь предположим, что наш скрипт pyweather требует очень определенной версии Python.

pyenv

pyenv — это утилита управления версиями для Python. Она позволяет, среди прочего, изменять версии Python для каждого проекта. Начиная с версии 2.21.0, direnv обеспечивает его поддержку, поэтому вместе они могут дать нам более высокий уровень контроля над версией, которую мы используем в нашей среде.

Давайте начнем с установки pyenv:

$ curl -L https://pyenv.run | bash

И нужно убедится, что pyenv будет доступен из нашего терминала:

$ echo 'export PATH="~/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ source ~/.bashrc

Теперь давайте предположим, что нашему скрипту pyweather требуется очень специфическая версия Python, 3.6.2.

Во-первых, нам нужно установить эту версию Python:

$ pyenv install 3.6.2

И теперь мы можем настроить ваш проект для использования конкретной версии:

$ echo 'layout pyenv 3.6.2' > .envrc
$ direnv allow

Мы можем проверить результат, проверив версию Python в среде:

$ python --version
Python 3.6.2

Если нам когда-либо потребуется изменить версию Python, нам будет достаточно изменить layout в файле .envrc.

Благодаря обеим утилитам мы можем изменить layout на любую версию Python, и наша виртуальная среда будет сразу обновлена.

Еще одним преимуществом использования direnv и pyenv является то, что мы можем перенести версию нашего файла .envrc в наш репозитории проектов.

Таким образом, все участники смогут настроить свою среду так, как это предусмотрено проектом, при условии, что они установят утилиты и нужную версию Python.

Заключение

Процесс работы с виртуальными средами независим от рабочего процесса разработки Python. Нам нужно помнить, чтобы настроить и активировать его, прежде чем работать с нашим проектом. Благодаря direnv и pyenv мы можем автоматизировать все это, и вход в папку проекта сделает всю работу за нас в фоновом режиме.

Установка обеих утилит может вызвать сложности, но после того, как вы это сделаем, вы сможете сэкономим много времени. И у вас также всегда будет уверенность, что вы работаем с правильной виртуальной средой и версией Python

Была ли вам полезна эта статья?
[2 / 5]

Spread the love
Подписаться
Уведомление о
guest
1 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Guest007
Guest007
4 лет назад

Так pyenv же сам делает всё, что надо!
pyenv install 3.8.2
pyenv virtualenv 3.8.2 newvenv
pyenv local newvenv
Всё. Если правильно все установили, то direnv не нужен.