Управление несколькими версиями Python с помощью pyenv
Вы когда-нибудь хотели внести свой вклад в проект, который поддерживает несколько версий Python, но не знаете, как легкоtestиспользовать все версии? Вы когда-нибудь интересовались новейшими и лучшими версиями Python? Возможно, вы хотели бы опробовать эти новые функции, но вам не нужно беспокоиться о том, чтобы испортить вашу среду разработки. К счастью, управление несколькими версиями Python не должно сбивать с толку, если вы используетеpyenv
.
Эта статья предоставит вам отличный обзор того, как максимально увеличить время, затрачиваемое на работу над проектами, и минимизировать время, затрачиваемое на головные боли при попытке использовать правильную версию Python.
Из этой статьи вы узнаете, как:
-
Установите несколько версий Python
-
Установите последнюю версию Python для разработки
-
Переключение между установленными версиями
-
Используйте виртуальные среды с
pyenv
-
Активируйте разные версии 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:
-
Установите Python в своем пользовательском пространстве
-
Установите несколько версий Python
-
Укажите точную версию Python, которую вы хотите
-
Переключение между установленными версиями
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
вместе с несколькими полезными плагинами:
-
pyenv
: фактическое приложениеpyenv
-
pyenv-virtualenv
: плагин дляpyenv
и виртуальных сред -
pyenv-update
: Плагин для обновленияpyenv
-
pyenv-doctor
: Плагин для проверки того, чтоpyenv
и зависимости сборки установлены -
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 | Описание |
---|---|
|
Список всех доступных версий Python для установки |
|
Создает отладочную версию Python |
|
Подробный режим: вывод статуса компиляции на стандартный вывод |
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
, - это вариант, который он будет использовать. Давайте посмотрим на быстрый пример:
$ 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
Теперь вы хотите работать над двумя разными проектами:
-
project1 поддерживает Python 2.7 и 3.6.
-
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, что по умолчанию заставляет мою подсказку выглядеть так:
На первый взгляд, я не знаю, какая версия Python активна. Чтобы понять это, мне пришлось бы запуститьpython -V
илиpyenv version
. Чтобы сократить время, затрачиваемое на выяснение моей активной среды Python, я добавляю используемую виртуальную средуpyenv
в свою подсказку:
Моя версия Python в этом случае -project1-venv
и отображается сразу в начале подсказки. Это позволяет мне быстро увидеть, какую версию Python я использую прямо сейчас. Если вы тоже хотите использовать это, вы можете использовать myagnoster-pyenv theme.