Автор оригинала: Leandro Cofre.
Управление средами Python с помощью different и pyenv
Вступление
Как разработчики Python, большинство из нас знакомы с Виртуальными средами . Одна из первых вещей, которую мы делаем при работе над новым проектом, – это создание среды. Мы обычно используем virtualenv или venv именно для этой цели.
Каждый проект, над которым мы работаем, использует разные пакеты и даже может быть совместим только с одной версией Python.
Делать что-то постоянно требует автоматизации. В этой статье мы увидим, как dir env
и pyenv
могут помочь нам в этом.
Кстати, некоторые современные идеи уже автоматизировали эти шаги. Например, 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.