Рубрики
Без рубрики

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

В этом уроке мы рассмотрим инструменты direnv и pyenv для автоматизации управления средами Python.

Автор оригинала: Leandro Cofre.

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

Вступление

Как разработчики Python, большинство из нас знакомы с Виртуальными средами . Одна из первых вещей, которую мы делаем при работе над новым проектом, – это создание среды. Мы обычно используем virtualenv или venv именно для этой цели.

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

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

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

Автоматизированное управление средой python PyCharm

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

Проблемы virtualenv

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

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

$ 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 помогает нам автоматизировать это.

диренв

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

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

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

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

Теперь нам нужно подключить dir env к bash . Мы отредактируем ~/.bashrc и затем перезагрузим его:

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

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

dir env проверит, нужно ли что-то загружать в текущую папку. Он проверяет существование файла с именем .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

Как мы видим на выходе, Виртуальная среда была немедленно создана. Однако приглашение не изменяется, поэтому мы не увидим имя среды, написанное в начале.

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

$ pip install -r requirements.txt

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

$ cd ..
direnv: unloading

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

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

pyenv

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

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

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

А затем обеспечить, чтобы он всегда был доступен нашему терминалу:

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

Теперь предположим, что наш скрипт weather требует очень специфической версии 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, нам будет достаточно изменить макет в файле .envrc .

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

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

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

Вывод

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

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