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

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

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

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

Из этой статьи вы узнаете, как:

  1. Установите несколько версий Python

  2. Установите последнюю версию Python для разработки

  3. Переключение между установленными версиями

  4. Используйте виртуальные среды сpyenv

  5. Активируйте разные версии Python и виртуальные среды автоматически

Free Bonus:Click here to get access to a chapter from Python Tricks: The Book, который демонстрирует вам лучшие практики Python на простых примерах, которые вы можете мгновенно применить для написания более красивого кода Pythonic.

Зачем использоватьpyenv?

pyenv - замечательный инструмент для управления несколькими версиями Python. Даже если в вашей системе уже установлен Python, стоит установитьpyenv, чтобы вы могли легко опробовать новые языковые функции или помочь внести свой вклад в проект, который работает на другой версии Python.

Почему бы не использовать системный Python?

«Системный Python» - это Python, который устанавливается в вашей операционной системе. Если у вас Mac или Linux, то по умолчанию, когда вы набираетеpython в своем терминале, вы получаете хороший Python REPL.

Так почему бы не использовать его? Один из способов взглянуть на это состоит в том, что этот Python действительноbelongs для операционной системы. В конце концов, он был установлен с операционной системой. Это даже отражается, когда вы запускаетеwhich:

$ which python
/usr/bin/python

Здесьpython доступен всем пользователям, о чем свидетельствует его местоположение/usr/bin/python. Скорее всего, это не та версия Python, которую вы хотите:

$ python -V
Pyhton 2.7.12

Чтобы установить пакет в Python в вашей системе, вы должны запуститьsudo pip install. Это потому, что вы устанавливаете пакет Python глобально, что является реальной проблемой, если другой пользователь приходит и хочет установить немного более старую версию пакета.

Проблемы с несколькими версиями одного и того же пакета, как правило, наполняют вас и кусают, когда вы меньше всего этого ожидаете. Один из распространенных способов решения этой проблемы - это популярный и стабильный пакет, который в своей системе неожиданно работает некорректно. После нескольких часов поиска и устранения неисправностей и поиска в Google вы можете обнаружить, что установили неправильную версию зависимости, и это разрушает ваш день.

Даже если ваша версия Python установлена ​​в/usr/local/bin/python3, вы все равно в опасности. Вы столкнетесь с теми же проблемами с разрешениями и гибкостью, которые описаны выше.

Кроме того, вы не очень контролируете, какая версия Python установлена ​​в вашей ОС. Если вы хотите использовать новейшие функции Python и, например, используете Ubuntu, вам просто не повезло. Версии по умолчанию могут быть слишком старыми, что означает, что вам просто нужно дождаться выхода новой ОС.

Наконец, некоторые операционные системы фактически используют упакованный Python для работы. Возьмем, к примеру,yum, который интенсивно использует Python для выполнения своей работы. Если вы устанавливаете новую версию Python и не будете осторожны при установке ее в свое пространство пользователя, вы можете серьезно повредить вашей способности использовать вашу ОС.

А как насчет менеджера пакетов?

Следующее логичное место для поиска - менеджеры пакетов. Такие программы, какapt,yum,brew илиport, являются типичными следующими вариантами. В конце концов, именно так вы устанавливаете большинство пакетов в свою систему. К сожалению, вы столкнетесь с такими же проблемами, используя менеджер пакетов.

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

Еще раз, вы все еще не можете контролировать, какую версию Python вы можете установить. Это правда, что некоторые репозитории дают вам больший выбор, но по умолчанию вы смотрите на любую версию Python, на которой работает ваш конкретный поставщик, в любой конкретный день.

Даже если вы устанавливаете Python из менеджера пакетов, подумайте, что произойдет, если вы пишете пакет и хотите поддерживать и тестировать на Python 3.4 - 3.7.

Что произойдет в вашей системе, если вы введетеpython3? Как бы вы быстро переключались между разными версиями? Вы, конечно, можете это сделать, но это утомительно и подвержено ошибкам. Не берите в голову тот факт, что если вы хотите PyPy, Jython или Miniconda, то вам, вероятно, просто не повезло с вашим менеджером пакетов.

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

  1. Установите Python в своем пользовательском пространстве

  2. Установите несколько версий Python

  3. Укажите точную версию Python, которую вы хотите

  4. Переключение между установленными версиями

pyenv позволяет делать все это и многое другое.

Установкаpyenv

Перед установкой самогоpyenv вам потребуются некоторые зависимости от ОС. Эти зависимости в основном представляют собой утилиты разработки, написанные на C, и они необходимы, потому чтоpyenv устанавливает Python путем сборки из исходного кода. Для более подробной разбивки и объяснения зависимостей сборки вы можете проверитьofficial docs.. В этом руководстве вы увидите наиболее распространенные способы установки этих зависимостей.

Note:pyenv изначально не поддерживал Windows. Однако, похоже, есть некоторая базовая поддержка проектаpyenv-win, который недавно стал активным. Если вы используете Windows, не стесняйтесь проверить это.

Зависимости сборки

pyenv собирает Python из исходного кода, а это значит, что вам потребуются зависимости сборки для фактического использованияpyenv. Зависимости сборки зависят от платформы. Если вы используетеUbuntu/Debian и хотите установить зависимости сборки, вы можете использовать следующее:

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

Это используетApt для установки всех зависимостей сборки. Пусть это запустится, и вы будете готовы перейти на системы Debian.

Если вы используетеFedora/CentOS/RHEL, вы можете использоватьyum для установки зависимостей сборки:

$ sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel

Эта команда установит все зависимости сборки для Python с использованиемyum.

ПользователиmacOS могут использовать следующую команду:

$ brew install openssl readline sqlite3 xz zlib

Эта команда используетHomebrew и устанавливает несколько зависимостей для пользователей macOS.

Tip: При запуске Mojave или более поздней версии (10.14+) вам также потребуется установитьadditional SDK headers:

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

Спасибо Родриго Виере за обновление.

Если вы вместо этого используетеopenSUSE, вы должны выполнить следующее:

$ zypper in zlib-devel bzip2 libbz2-devel libffi-devel \
libopenssl-devel readline-devel sqlite3 sqlite3-devel xz xz-devel

Еще раз, эта команда устанавливает все зависимости сборки Python для вашей системы.

Наконец, для пользователейAlpine вы можете использовать это:

$ apk add libffi-dev ncurses-dev openssl-dev readline-dev \
tk-dev xz-dev zlib-dev

Эта команда используетapk в качестве диспетчера пакетов и устанавливает все зависимости сборки для Python на Alpine.

Использование pyenv-установщика

После того, как вы установили зависимости сборки, вы готовы к установке самогоpyenv. Я рекомендую использоватьpyenv-installer project:

$ curl https://pyenv.run | bash

Это установитpyenv вместе с несколькими полезными плагинами:

  1. pyenv: фактическое приложениеpyenv

  2. pyenv-virtualenv: плагин дляpyenv и виртуальных сред

  3. pyenv-update: Плагин для обновленияpyenv

  4. pyenv-doctor: Плагин для проверки того, чтоpyenv и зависимости сборки установлены

  5. pyenv-which-ext: Плагин для автоматического поиска системных команд

Note: Приведенная выше команда аналогична загрузкеpyenv-installer script и его локальному запуску. Поэтому, если вы хотите точно увидеть, что у вас работает, вы можете просмотреть файл самостоятельно. Кроме того, если вы действительно не хотите запускать скрипт, вы можете проверитьmanual installation instructions.

В конце прогона вы должны увидеть что-то вроде этого:

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Вывод будет основан на вашей оболочке. Но вы должны следовать инструкциям, чтобы добавитьpyenv к вашему пути и инициализировать автозаполнениеpyenv /pyenv-virtualenv. После того, как вы это сделали, вам нужно перезагрузить вашу оболочку:

$ exec "$SHELL" # Or just restart your terminal

Это оно. Теперь у вас установленыpyenv и четыре полезных плагина.

Использованиеpyenv для установки Python

Теперь, когда у вас установленpyenv, следующим шагом будет установка Python. У вас есть много версий Python на выбор. Если вы хотите увидеть все доступные CPython 3.6 - 3.8, вы можете сделать это:

$ pyenv install --list | grep " 3\.[678]"
  3.6.0
  3.6-dev
  3.6.1
  3.6.2
  3.6.3
  3.6.4
  3.6.5
  3.6.6
  3.6.7
  3.6.8
  3.7.0
  3.7-dev
  3.7.1
  3.7.2
  3.8-dev

Выше показаны все версии Python, о которых знаетpyenv, которые соответствуют регулярному выражению. В данном случае это все доступные версии CPython с 3.6 по 3.8. Аналогично, если вы хотите увидеть все версии Jython, вы можете сделать это:

$ pyenv install --list | grep "jython"
  jython-dev
  jython-2.5.0
  jython-2.5-dev
  jython-2.5.1
  jython-2.5.2
  jython-2.5.3
  jython-2.5.4-rc1
  jython-2.7.0
  jython-2.7.1

Опять же, вы можете увидеть все версии Jython, которые предлагаетpyenv. Если вы хотите увидеть все версии, вы можете сделать следующее:

$ pyenv install --list
...
# There are a lot

Найдя нужную версию, вы можете установить ее одной командой:

$ pyenv install -v 3.7.2
/tmp/python-build.20190208022403.30568 ~
Downloading Python-3.7.2.tar.xz...
-> https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
Installing Python-3.7.2...
/tmp/python-build.20190208022403.30568/Python-3.7.2 /tmp/python-build.20190208022403.30568 ~
[...]
Installing collected packages: setuptools, pip
Successfully installed pip-18.1 setuptools-40.6.2
Installed Python-3.7.2 to /home/realpython/.pyenv/versions/3.7.2

Having Problems?pyenv documentation имеет отличные примечания по установке, а также полезныйFAQ вместе сcommon build problems.

Это займет некоторое время, потому чтоpyenv собирает Python из исходников, но как только это будет сделано, на вашем локальном компьютере будет доступен Python 3.7.2. Если вы не хотите видеть весь вывод, просто удалите флаг-v. Даже разрабатываемые версии CPython могут быть установлены:

$ pyenv install 3.8-dev

Pro Tip: Если вы какое-то время использовалиpyenv и не видите нужную версию, вам может потребоваться запуститьpyenv update, чтобы обновить инструмент и убедиться, что вы иметь доступ к последним версиям.

В оставшейся части руководства в примерах предполагается, что вы установили3.6.8 и2.7.15, но вы можете заменить эти значения фактически установленными версиями Python. Также обратите внимание, что системная версия Python в примерах -2.7.12.

Место установки

Как упоминалось ранее,pyenv работает путем сборки Python из исходного кода. Каждая установленная вами версия удобно расположена в корневом каталогеpyenv:

$ ls ~/.pyenv/versions/
2.7.15  3.6.8  3.8-dev

Все ваши версии будут расположены здесь. Это удобно, потому что удаление этих версий тривиально:

$ rm -rf ~/.pyenv/versions/2.7.15

Конечно,pyenv также предоставляет команду для удаления определенной версии Python:

$ pyenv uninstall 2.7.15

Используя ваш новый Python

Теперь, когда вы установили несколько разных версий Python, давайте посмотрим, как их использовать. Сначала проверьте, какие версии Python у вас есть:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

* указывает, что версия Pythonsystem активна в настоящее время. Вы также заметите, что это устанавливается файлом в корневом каталогеpyenv. Это означает, что по умолчанию вы все еще используете системный Python:

$ python -V
Python 2.7.12

Если вы попытаетесь подтвердить это с помощьюwhich, вы увидите следующее:

$ which python
/home/realpython/.pyenv/shims/python

Это может быть удивительно, но так работаетpyenv. pyenv вставляется в вашPATH и с точки зрения вашей ОСis вызывается исполняемый файл. Если вы хотите увидеть фактический путь, вы можете выполнить следующее:

$ pyenv which python
/usr/bin/python

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

$ pyenv global 2.7.15
$ python -V
Python 2.7.15

$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.pyenv/version)
  3.6.8
  3.8-dev

Pro Tip: Отличный способ убедиться в том, что только что установленная версия Python работает правильно, - это запустить встроенный набор тестов:

$ pyenv global 3.8-dev
$ python -m test

Это запустит множество внутренних тестов Python, которые проверит вашу установку. Вы можете просто откинуться назад и посмотреть, как пройдут тесты.

Если вы когда-нибудь захотите вернуться к системной версии Python по умолчанию, вы можете запустить это:

$ pyenv global system
$ python -V
Python 2.7.12

Теперь вы можете легко переключаться между различными версиями Python. Это только начало. Если у вас есть много версий, между которыми вы хотите переключаться, последовательный ввод этих команд утомителен. В этом разделе рассматриваются основы, но лучший рабочий процесс описан вworking with multiple environments.

Изучение командpyenv

pyenv предлагает множество команд. Вы можете увидеть полный список всех доступных команд с этим:

$ pyenv commands
activate
commands
completions
deactivate
...
virtualenvs
whence
which

Это выводит все имена команд. У каждой команды есть флаг--help, который предоставит вам более подробную информацию. Например, если вы хотите получить дополнительную информацию о командеshims, вы можете запустить следующее:

$ pyenv shims --help
Usage: pyenv shims [--short]

List existing pyenv shims

Справочное сообщение описывает, для чего используется команда, и любые параметры, которые вы можете использовать в сочетании с командой. В следующих разделах вы найдете краткий обзор наиболее часто используемых команд.

install

Вы уже видели командуinstall выше. Эта команда может использоваться для установки определенной версии Python. Например, если вы хотите установить3.6.8, вы должны использовать это:

$ pyenv install 3.6.8

Вывод показывает, чтоpyenv загружает и устанавливает Python. Вот некоторые из распространенных флагов, которые вы можете использовать:

Flag Описание

-l/--list

Список всех доступных версий Python для установки

-g/--debug

Создает отладочную версию Python

-v/--verbose

Подробный режим: вывод статуса компиляции на стандартный вывод

versions

Командаversions отображает все установленные на данный момент версии Python:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

Этот вывод показывает не только то, что2.7.15,3.6.8,3.8-dev и ваш Pythonsystem установлены, но также показывает, что Pythonsystem активен. Если вы заботитесь только о текущей активной версии, вы можете использовать следующую команду:

$ pyenv version
system (set by /home/realpython/.pyenv/version)

Эта команда похожа наversions, но показывает только текущую активную версию Python.

which

Командаwhich полезна для определения полного пути к системному исполняемому файлу. Посколькуpyenv работает с использованием прокладок, эта команда позволяет вам увидеть полный путь к исполняемому файлуpyenv. Например, если вы хотите увидеть, где установленpip, вы можете запустить это:

$ pyenv which pip
/home/realpython/.pyenv/versions/3.6.8/bin/pip

В выходных данных отображается полный системный путь дляpip. Это может быть полезно, если вы установили приложения командной строки.

global

Командаglobal устанавливает глобальную версию Python. Это может быть переопределено другими командами, но полезно для гарантии того, что вы используете определенную версию Python по умолчанию. Если вы хотите использовать3.6.8 по умолчанию, вы можете запустить это:

$ pyenv global 3.6.8

Эта команда устанавливает~/.pyenv/version на3.6.8. Дополнительные сведения см. В разделеspecifying your Python version.

local

Командаlocal часто используется для установки версии Python для конкретного приложения. Вы можете использовать его, чтобы установить версию на2.7.15:

$ pyenv local 2.7.15

Эта команда создает файл.python-version в вашем текущем каталоге. Если в вашей среде активенpyenv, этот файл автоматически активирует эту версию для вас.

shell

Командаshell используется для установки версии Python для конкретной оболочки. Например, если вы хотите протестировать версию Python3.8-dev, вы можете сделать это:

$ pyenv shell 3.8-dev

Эта команда активирует версию, указанную путем установки переменной средыPYENV_VERSION. Эта команда перезаписывает любые приложения или глобальные настройки, которые у вас могут быть. Если вы хотите деактивировать версию, вы можете использовать флаг--unset.

Указание вашей версии Python

Одна из наиболее запутанных частейpyenv заключается в том, как именно разрешается командаpython и какие команды можно использовать для ее изменения. Как упоминалось в командах, есть 3 способа изменить используемую версиюpython. Так как все эти команды взаимодействуют друг с другом? Порядок разрешения выглядит примерно так:

Pyenv pyramid for order of resolution

Эта пирамида предназначена для чтения сверху вниз. Первый из этих параметров, который может найтиpyenv, - это вариант, который он будет использовать. Давайте посмотрим на быстрый пример:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

Здесь используется вашsystem Python, как обозначено*. Чтобы выполнить следующую наиболее глобальную настройку, вы используетеglobal:

$ pyenv global 3.6.8
$ pyenv versions
  system
  2.7.15
* 3.6.8 (set by /home/realpython/.pyenv/version)
  3.8-dev

Как видите, теперьpyenv хочет использовать3.6.8 в качестве нашей версии Python. Он даже указывает на местоположение найденного файла. Этот файл действительно существует, и вы можете перечислить его содержимое:

$ cat ~/.pyenv/version
3.6.8

Теперь давайте создадим файл.python-version сlocal:

$ pyenv local 2.7.15
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev
$ ls -a
.  ..  .python-version
$ cat .python-version
2.7.15

Здесь сноваpyenv указывает, как он разрешит нашу командуpython. На этот раз он исходит от~/.python-version. Обратите внимание, что поиск.python-version является рекурсивным:

$ mkdir subdirectory
$ cd subdirectory
$ ls -la # Notice no .python-version file
. ..
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev

Несмотря на то, что вsubdirectory нет.python-version, версия все равно установлена ​​на2.7.15, потому что.python-version существует в родительском каталоге.

Наконец, вы можете установить версию Python с помощьюshell:

$ pyenv shell 3.8-dev
$ pyenv versions
  system
  2.7.15
  3.6.8
* 3.8-dev (set by PYENV_VERSION environment variable)

Все, что это было сделано, - это установка переменной окружения$PYENV_VERSION:

$ echo $PYENV_VERSION
3.8-dev

Если вас ошеломили варианты, в разделеworking with multiple environments описан самоуверенный процесс управления этими файлами, в основном с использованиемlocal.

Виртуальные среды иpyenv

Виртуальные среды являются важной частью управления установками и приложениями Python. Если вы раньше не слышали о виртуальных средах, попробуйтеPython Virtual Environments: A Primer.

Виртуальная среда иpyenv - это союз, заключенный на небесах. pyenv имеет замечательный плагин под названиемpyenv-virtualenv, который упрощает работу с несколькими виртуальными средами версии Pythonand. Если вам интересно, в чем разница междуpyenv,pyenv-virtualenv и такими инструментами, какvirtualenv илиvenv, не волнуйтесь. Ты не одинок.

Вот что вам нужно знать:

  • pyenv управляет несколькими версиями самого Python.

  • virtualenv/venv управляет виртуальными средами для конкретной версии Python.

  • pyenv-virtualenv управляет виртуальными средами для разных версий Python.

Если вы упорный пользовательvirtualenv илиvenv, не волнуйтесь:pyenv отлично работает с ними. Фактически, вы можете сохранить тот же рабочий процесс, что и у вас, если хотите, хотя я думаю, чтоpyenv-virtualenv делает работу более приятной, когда вы переключаетесь между несколькими средами, требующими разных версий Python.

Хорошая новость заключается в том, что, поскольку вы использовали сценарийpyenv-installer для установкиpyenv, у вас уже естьpyenv-virtualenv, установленный и готовый к работе.

Создание виртуальных сред

Создание виртуальной среды - это одна команда:

$ pyenv virtualenv  

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

<environment_name> - это просто название, которое помогает разделить среду. Хорошей практикой является присвоение вашей среде того же имени, что и ваш проект. Например, если вы работали надmyproject и хотели разработать против Python 3.6.8, вы должны запустить это:

$ pyenv virtualenv 3.6.8 myproject

Вывод включает сообщения, которые показывают установку пары дополнительных пакетов Python, а именноwheel,pip иsetuptools. Это сделано исключительно для удобства и просто устанавливает более полнофункциональную среду для каждой из ваших виртуальных сред.

Активация ваших версий

Теперь, когда вы создали свою виртуальную среду, ее использование - следующий шаг. Обычно вы должны активировать свою среду, выполнив следующее:

$ pyenv local myproject

Вы уже видели командуpyenv local, но на этот раз вместо указания версии Python вы указываете среду. Это создает файл.python-version в вашем текущем рабочем каталоге, и поскольку вы запускалиeval "$(pyenv virtualenv-init -)" в своей среде, среда будет автоматически активирована.

Вы можете убедиться в этом, выполнив следующее:

$ pyenv which python
/home/realpython/.pyenv/versions/myproject/bin/python

Вы можете видеть, что была создана новая версия с именемmyproject, и исполняемый файлpython указывает на эту версию. Если вы посмотрите на любой исполняемый файл, который предоставляет эта среда, вы увидите то же самое. Возьмем, например,pip:

$ pyenv which pip
/home/realpython/.pyenv/versions/myproject/bin/pip

Если вы не настроилиeval "$(pyenv virtualenv-init -)" для запуска в своей оболочке, вы можете вручную активировать / деактивировать свои версии Python следующим образом:

$ pyenv activate 
$ pyenv deactivate

Вышеупомянутое - это то, что делаетpyenv-virtualenv, когда он входит в каталог с файлом.python-version или выходит из него.

Работа с несколькими средами

Собрав все, что вы узнали, вы можете эффективно работать в разных средах. Предположим, у вас установлены следующие версии:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

Теперь вы хотите работать над двумя разными проектами:

  1. project1 поддерживает Python 2.7 и 3.6.

  2. project2 поддерживает Python 3.6 и экспериментирует с 3.8-dev.

Вы можете видеть, что по умолчанию вы используете системный Python, что обозначено* в выводеpyenv versions. Сначала создайте виртуальную среду для первого проекта:

$ cd project1/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.6.8 project1
...
$ pyenv local project1
$ python -V
/home/realpython/.pyenv/versions/project1/bin/python

Наконец, обратите внимание, что когда выcd вне каталога, вы по умолчанию возвращаетесь к системному Python:

$ cd $HOME
$ pyenv which python
/usr/bin/python

Вы можете выполнить вышеуказанные шаги и создать виртуальную среду для project2:

$ cd project2/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.8-dev project2
...
$ pyenv local 3.8-dev
$ pyenv which python
/home/realpython/.pyenv/versions/3.8-dev/bin/python

Это однократные шаги для ваших проектов. Теперь, когда выcd между проектами, ваши среды автоматически активируются:

$ cd project2/
$ python -V
Python 3.8.0a0
$ cd ../project1
$ python -V
Python 3.6.8

Больше не нужно помнить об активации сред: вы можете переключаться между всеми своими проектами, аpyenv позаботится об автоматической активации правильных версий Pythonand в правильных виртуальных средах.

Активация нескольких версий одновременно

Как описано в примере выше,project2 использует экспериментальные функции 3.8. Предположим, вы хотели убедиться, что ваш код все еще работает на Python 3.6. Если вы попытаетесь запуститьpython3.6, вы получите следующее:

$ cd project2/
$ python3.6 -V
pyenv: python3.6: command not found

The `python3.6' command exists in these Python versions:
  3.6.8
  3.6.8/envs/project1
  project1

pyenv сообщает вам, что, хотя Python 3.6 недоступен в текущей активной среде, он доступен в других средах. pyenv дает вам возможность активировать несколько сред одновременно с помощью знакомой команды:

$ pyenv local project2 3.6.8

Это указываетpyenv, что вы хотите использовать виртуальную средуproject2 в качестве первого варианта. Итак, если команда, напримерpython, может быть разрешена в обеих средах, она выберетproject2 перед3.6.8. Давайте посмотрим, что произойдет, если вы запустите это:

$ python3.6 -V
Python 3.6.8

Здесьpyenv пытается найти командуpython3.6, и поскольку он находит ее в активной среде, он разрешает выполнение команды. Это чрезвычайно полезно для таких инструментов, какtox, которым для выполнения требуется, чтобы на вашемPATH было доступно несколько версий Python.

Pro Tip: Если вы используете tox иpyenv, вам следует проверить пакетtox-pyenv.

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

$ pyenv virtualenv 3.6.8 project2-tmp
$ pyenv local project2-tmp

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

$ pyenv local project2 3.6.8

Заключение

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

Вы видели, какpyenv может вам помочь:

  • Установите несколько версий Python

  • Переключение между установленными версиями

  • Используйте виртуальные среды сpyenv

  • Активируйте разные версии Python и виртуальные среды автоматически

Если у вас все еще есть вопросы, не стесняйтесь обращаться либо в разделе комментариев, либо в Twitter. Кроме того,pyenv documentation - отличный ресурс.

Бонус: отображение имени вашей среды в командной строке

Если вы мне нравитесь и постоянно переключаетесь между различными виртуальными средами и версиями Python, легко запутаться, какая версия активна в настоящее время. Я используюoh-my-zsh иagnoster theme, что по умолчанию заставляет мою подсказку выглядеть так:

Agnoster theme with no pyenv prompt

На первый взгляд, я не знаю, какая версия Python активна. Чтобы понять это, мне пришлось бы запуститьpython -V илиpyenv version. Чтобы сократить время, затрачиваемое на выяснение моей активной среды Python, я добавляю используемую виртуальную средуpyenv в свою подсказку:

Environment name being shown in ZSH command prompt

Моя версия Python в этом случае -project1-venv и отображается сразу в начале подсказки. Это позволяет мне быстро увидеть, какую версию Python я использую прямо сейчас. Если вы тоже хотите использовать это, вы можете использовать myagnoster-pyenv theme.