Программирование PC Управление несколькими версиями Python с помощью pyenv Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Управление несколькими версиями Python с помощью pyenv Печать
Добавил(а) microsin   

Некоторые программные инструменты для своей работы требуют наличие установки определенной версии Python (например, так у меня получилось с компилятором NPU для процессора GX8002 []). Утилита pyenv позволяет держать на компьютере несколько версий Python и легко переключаться между ними. Даже если в системе уже установлен Python, стоит установить pyenv, чтобы можно было легко опробовать новые языковые функции альтернативных версий Python.

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

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

$ which python
/usr/bin/python

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

$ python -V
Python 2.7.12

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

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

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

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

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

Package Manager. Следующее, на что надо обратить внимание - менеджеры пакетов, такие как 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 путем сборки его из исходного кода. Здесь мы рассмотрим наиболее распространенные способы установки этих зависимостей.

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

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

$ 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

Если при запуске этой команды столкнулись с ошибкой "Unable to locate package python-openssl", то удалите этот пакет из командной строки, и запустите её заново. С такой ошибкой я столкнулся на Raspberry Pi 2 b.

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

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

Под macOS можно использовать команду brew (сработает менеджер пакетов Homebrew):

$ brew install openssl readline sqlite3 xz zlib

Совет: когда работает Mojave или более свежая версия (10.14+) то вам также понадобится установить дополнительные заголовки SDK:

$ 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

И наконец, для пользователей Alpine можно ввести команду (в качестве менеджера пакетов используется apk):

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

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

$ curl https://pyenv.run | bash

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

pyenv: само приложение pyenv.
pyenv-virtualenv: плагин для pyenv и виртуальных рабочих окружений.
pyenv-update: плагин для обновления pyenv.
pyenv-doctor: плагин для проверки, что установлена pyenv и зависимости сборки.
pyenv-which-ext: плагин для автоматического поиска системных команд.

Примечание: показанная выше команда curl делает то же самое, что и загрузка срипта pyenv-installer и его локальный запуск. Так что если вы захотите узнать, что на самом деле будет происходить при установке, то можете посмотреть на содержимое этого скрипта. Альтернативно, если вы не хотите запускать этот скрипт, то можете попробовать выполнить инструкции по установке вручную.

При запуске команды curl https://pyenv.run | bash вы можете столкнуться с ошибкой наподобие следующей:

$ curl https://pyenv.run | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Эта ошибка легко исправляется, если добавить в командную строку опцию -k, которая отключает проверку сертификата. Для этого откройте ссылку https://pyenv.run, вы увидите текст скрипта, который надо подправить:

$ wget --no-check-certificate https://pyenv.run
$ mv index.html setup-pyenv.sh

Мы получим файл вот такого содержимого:

#!/bin/bash
#
# Usage: curl https://pyenv.run | bash
#
# For more info, visit: https://github.com/pyenv/pyenv-installer
#
index_main() {
    set -e
    curl -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
}
index_main

Добавьте в этом скрипте после curl опцию -k:

curl -k -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

После этого добавьте к скрипту атрибут, разрешающий выполнение, и запустите его:

$ chmod +x setup-pyenv.sh
$ ./setup-pyenv.sh

После завершения работы скрипта вы увидите что-то наподобие следующего:

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 -)"

Здесь даны указания, какие строчки надо добавить в профиль настройки рабочего окружения по умолчанию (файл ~/.bashrc). Этот вывод будет зависеть от вашего шелла. Вам нужно последовать этим указаниям, чтобы добавить pyenv в пути поиска запускаемых программ (переменная окружения PATH), и инициализировать pyenv/pyenv-virtualenv auto completion. Например, на Ubuntu для настройки терминала bash добавтье в конец файла ~/.bashrc следующие строки:

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

После того, как это было сделано, нужно перезагрузить ваш шелл (или просто закройте окно терминала и снова откройте его):

$ exec "$SHELL"

На этом все. Теперь у вас есть готовая к работе утилита pyenv и её плагины.

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

Следующим шагом после установки pyenv будет установка нужной версии Python. Вы можете выбрать и установить множество версий Python. Например, если ван нужно посмотреть, какие есть версии Python от 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

Подобным образом, если нам надо увидеть все версии 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

После того, как вы определились с версией Python, которую хотите установить, введите команду с указанием версии. Например, для установки Python 3.6.15:

$ pyenv install -v 3.6.15

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

$ pyenv install 3.6.15

Таким же образом можно установить несколько версий Python:

$ pyenv install 2.7.18

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

Дополнительную информацию по pyenv и решению проблем см. в репозитории [4].

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

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

Вывод этой команды показывает каталоги 2.7.15, 3.6.8, 3.8-dev, где установлены соответствующие версии Python. Любую из этих установленных версий можно удалить командой rm. Например, если нужно удалить Python 2.7.15:

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

Также есть эквивалентная команда pyenv uninstall, с помощью которой можно удалить указанную версию:

$ pyenv uninstall 2.7.15

Управление версиями Python. Следующая команда показывает, какие версии Python у вас установлены:

$ pyenv versions
* system (set by /home/имяпользователя/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

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

$ python -V
Python 2.7.12

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

$ which python
/home/имяпользователя/.pyenv/shims/python

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

$ pyenv which python
/usr/bin/python

Например, если вы хотите переключиться на другую версию Python, то используйте команду global:

$ pyenv global 2.7.15
$ python -V
Python 2.7.15 
 
$ pyenv versions
  system
* 2.7.15 (set by /home/имяпользователя/.pyenv/version)
  3.6.8
  3.8-dev

Совет для профи: хорошим способом проверить, что только что установленная версия Python работает правильно, будет запуск встроенного теста:

$ pyenv global 3.8-dev
$ python -m test

Эта команда запустит набор внутренних тестов Python, которые проверят вашу инсталляцию.

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

$ pyenv global system
$ python -V
Python 2.7.12

Команда pyenv global дает возможность непринужденно переключаться между разными версиями Python.

[Обзор команд pyenv]

Вот так можно посмотреть список доступных команд:

$ pyenv commands
--version
activate
commands
completions
deactivate
doctor
exec
global
help
...
virtualenvs
whence
which

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

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

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

$ pyenv install 3.6.8

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

Флаг Описание
-l (--list) Перечислит все доступные для установки версии Python.
-g (--debug) Выполнит сборку отладочной верси Python.
-v (--verbose) Подробный режим: будет выводить состояние процесса компиляции в stdout.

versions. Команда versions покажет все установленные в настоящий момент версии Python:

$ pyenv versions
* system (set by /home/имяпользователя/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

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

$ pyenv version
system (set by /home/имяпользователя/.pyenv/version)

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

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

$ pyenv which pip
/home/имяпользователя/.pyenv/versions/3.6.8/bin/pip

В выводе будет показан полный системный путь до pip.

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

$ pyenv global 3.6.8

Эта команда установит ~/.pyenv/version на 3.6.8. Для дополнительной информации см. далее "Как указать вашу версию Python".

local. Команда local часто используется для установки версии Python, специфичной для приложения. Например следующая команда:

$ pyenv local 2.7.15

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

shell. Команда shell используется для установки версии Python, специфичной для шелла. Например, если вы хотите протестить версию Python 3.8-dev, то запустите команду:

$ pyenv shell 3.8-dev

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

[Как указать вашу версию Python]

Одна из наиболее запутанных частей pyenv заключается в том, как именно разрешается команда python, и какие команды можно использовать для изменения этого разрешения. Как было показано выше, существует 3 способа модифицировать используюмую версию python (комадами global, local и shell). Как эти команды взаимодействую друг с другом?

Порядок поиска и разрешения команд выглядит примерно так:

pyenv command resolution order

Эта пирамида означает, что чтение происходит сверху вниз. Будет использовано первое, что pyenv сможет найти. Рассмотрим простой пример:

$ pyenv versions
* system (set by /home/имяпользователя/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

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

$ pyenv global 3.6.8
$ pyenv versions
  system
  2.7.15
* 3.6.8 (set by /home/имяпользователя/.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/имяпользователя/.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 # здесь нет файла .python-version
. ..
$ pyenv versions
  system
* 2.7.15 (set by /home/имяпользователя/.python-version)
  3.6.8
  3.8-dev

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

И наконец, можно установить версию 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

Если вы слишком перегружены этими опциями, то см. описание процесса управления этими файлами "Работа с несколькими рабочими окружениями", в основном используя local.

[Виртуальные рабочие окружения и pyenv]

Virtual Environment большая часть системы управления инсталляциями и приложениями Python. Если вы раньше ничего не слышали про виртуальные рабочие окружения, см. букварь [5].

Виртуальные рабочие окружения и pyenv образуют идеальную интеграцию. У pyenv есть отличный плагин pyenv-virtualenv, который сильно облегчает работу с несколькимиверсиями Python и несколькими виртуальными окружениями. Если вы сходу не разобрались, в чем разница между 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> < имя_окружения>

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

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

$ pyenv virtualenv 3.6.8 myproject

Вывод команды покажет, что устанавливается несклько дополнительных пакетов Python, а именно wheel, pip и setuptools. Это делается строго для удобства, и просто более полно настраивает каждое виртуальное рабочее окружение.

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

$ pyenv local myproject

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

Это можно проверить, запустив команду:

$ pyenv which python
/home/имяпользователя/.pyenv/versions/myproject/bin/python

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

$ pyenv which pip
/home/имяпользователя/.pyenv/versions/myproject/bin/pip

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

$ pyenv activate < имя_окружения>
$ pyenv deactivate

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

[Работа с несколькими рабочими окружениями]

Если объединить все, что мы уже научились, то получится эффективная работа с несколькими рабочими окружениями. Предположим, что у нас установлены версии:

$ pyenv versions
* system (set by /home/имяпользователя/.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.

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

$ cd project1/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.6.8 project1
...
$ pyenv local project1
$ python -V
/home/имяпользователя/.pyenv/versions/project1/bin/python

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

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

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

$ cd project2/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.8-dev project2
...
$ pyenv local 3.8-dev
$ pyenv which python
/home/имяпользователя/.pyenv/versions/3.8-dev/bin/python

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

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

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

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

Как было описано в примере выше, project2 использует экспериментальные фичи Python 3.8. Предположим, что вы решили убедиться, что код проекта project2 все еще работает на 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 предоставляет вам способ активировать несколько окружений сразу знакомой командой local:

$ pyenv local project2 3.6.8

Эта команда указывает для pyenv, что вы хотите использовать виртуальное окружение project2 в качестве первой опции. Так что если команда, например python, может быть распознана в обоих окружениях, то сначала будет браться настройка из project2 перед 3.6.8. Посмотрим, что произойдет, если вы запустите:

$ python3.6 -V
Python 3.6.8

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

Совет профи: если вы используете 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 и виртуальные окружения.

[Бонус: отображение имени окружения в командной строке шелла]

Если вы часто переключаетесь между окружениями с разными версиями Python, то вероятно заметили, что нет прямой подсказки о том, какая версия сейчас активна. Автор статьи [1] рекомендует oh-my-zsh [6] и тему agnoster [7], которые делают приглашение командной строки примерно таким:

pyenv prompt default

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

pyenv prompt agnoster

В этом примере версия Python соответствует project1-venv, что сразу отображается в начале приглашения командной строки. Если вам это понравилось, то вы можете использовать тему agnoster-pyenv [8].

[Ссылки]

1. Managing Multiple Python Versions With pyenv site:realpython.com.
2. How to use pyenv to manage Python versions site:blog.teclado.com.
3. pyenv / pyenv-installer site:github.com.
4. Документация по pyenv (https://github.com/pyenv/pyenv).
5. Python Virtual Environments: A Primer site:realpython.com.
6. ohmyzsh / ohmyzsh site:github.com.
7. agnoster / agnoster-zsh-theme site:github.com.
8. loganasherjones / agnoster-pyenv site:github.com.
9230912pyenv.zip - архив с репозиториями [3, 4, 6, 7, 8].
10Установка компилятора NPU для процессора GX8002.
11На компьютере установлены две или больше разных версий Python.

 

Добавить комментарий


Защитный код
Обновить

Top of Page