Разработчики и тестировщики Python часто поддерживают несколько версий Python. Переключение между версиями может быть болезненным. На Mac проблема еще хуже, так как ОС включает Python. Ваш дружелюбный Mac не позволит вам связываться с его Python, и если вы это сделаете, вы можете заблокировать свой Mac или, что еще хуже, ваши изменения будут перезаписаны при следующем обновлении. К счастью, есть удобный инструмент под названием pyenv, который значительно упрощает жизнь.

ПРИМЕЧАНИЕ. В этой статье обсуждается расширенный способ использования Python там, где вам нужно несколько версий. Если ваши потребности проще, посмотрите мою историю Как правильно установить Python на вашем Mac. Полное руководство можно найти в моей истории От нуля до героя: настройте свой Mac для разработки программного обеспечения.

Эта статья состоит из четырех частей:

  1. Реальное использование pyenv
  2. Установка pyenv
  3. Установка версий Python
  4. Использование pyenv

Часть 1: Реальное использование pyenv

Прежде чем мы перейдем к как pyenv, что вы можете с ним сделать?

Переключайте версии Python, меняя каталоги

Это одна из самых крутых вечеринок pyenv. Просто смените каталоги, и версия Python волшебным образом изменится! Если у вас есть один проект, использующий Python 2.7.17, а другой - Python 3.8.1, переключение каталогов между проектами автоматически изменяет вашу версию Python.

$ cd project1
project1$ python --version
Python 2.7.17
project1$ cd ../project2
project2$ python --version
Python 3.8.1

Бум!

Используйте несколько версий Python одновременно

Хотя наличие одной версии Python для каждого проекта - это хорошая идея, вероятно, более реалистично, что один проект нужно будет запускать на нескольких версиях Python. pyenv упрощает использование нескольких версий.

Например, предположим, что ваш проект должен работать в пяти версиях: Python 2.7, 3.5, 3.6, 3.7 и 3.8. С помощью pyenv вы можете установить версию по умолчанию, но легко обращаться ко всем пяти версиям. Это делает использование такого инструмента, как tox, удобным.

$ python --version
Python 3.6.10
$ python3.5 --version
Python 3.5.9
$ python3.7 --version
Python 3.7.6
$ python3.8 --version
Python 3.8.1
$ python2.7 --version
Python 2.7.17

Переключение версий Python по команде

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

$ pyenv local 2.7.17
$ python --version
Python 2.7.17
$ pyenv local 3.5.9
$ python --version
Python 3.5.9

Это упрощает запуск тестов для разных версий Python. Например, вы можете запускать модульные тесты с помощью pytest для Python 2.7, переключаться на Python 3.8 и снова запускать тесты - и все это с помощью трех простых команд.

$ pytest
================= test session starts =================
platform darwin -- Python 2.7.17, pytest-4.6.9, py-1.8.1, pluggy-0.13.1
rootdir: /Users/usario/proj/compatibleversion, inifile: setup.cfg
collected 3 items
tests/test_compatibleversion.py ...                        [100%]
================= 3 passed in 0.20 seconds =================
$ pyenv local 3.8.1
$ pytest
================= test session starts =================
platform darwin -- Python 3.8.1, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: /Users/usario/proj/compatibleversion, inifile: setup.cfg
collected 3 items
tests/test_compatibleversion.py ...                         [100%]
================= 3 passed in 0.37s =================

Часть 2: Установка pyenv

Установка версий pyenv и Python - это две отдельные задачи. В этом разделе описывается установка самого двоичного файла pyenv. В следующем разделе рассказывается об установке версий Python.

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

Задачи установки pyenv не нужно повторять для каждой новой устанавливаемой версии Python.

Шаг 1. Установите Homebrew

На Mac я рекомендую использовать Homebrew для установки pyenv. Если вы уже используете Homebrew, переходите к шагу 2. В противном случае запустите эту команду в терминале MacOS, чтобы установить Homebrew на свой Mac:

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

(Если вы предпочитаете не использовать Homebrew, есть другие варианты установки, доступные в основном репозитории pyenv.)

Шаг 2. Установите двоичный файл pyenv

Используя Homebrew, установить pyenv очень просто:

$ brew update
$ brew install pyenv

После установки pyenv вы можете обновиться до более новых версий, когда захотите, используя Homebrew.

$ brew update
$ brew upgrade pyenv

Если у вас уже установлена ​​последняя версия, появится предупреждение, подобное этому:

Warning: pyenv 1.2.16 already installed

Шаг 3. Включите pyenv в своем профиле

Для того, чтобы pyenv работал, вам необходимо обновить конфигурацию вашего профиля оболочки / терминала.

Расположение вашего профиля оболочки зависит от того, какую оболочку вы используете. Легкий способ узнать - это строка заголовка окна Терминала macOS. В середине текста слева от размеров окна показано, какую оболочку вы используете. Скорее всего, это либо bash, либо zsh. (Кроме того, последний символ в приглашении оболочки также является подсказкой. $ обычно означает bash, а % обычно означает zsh.) Если вы используете bash, конфигурация вашего профиля находится в ~/.bash_profile. Если вы используете zsh, ваш профиль состоит из ~/.zprofile и ~/.zshrc.

Эти команды добавят в вашу конфигурацию строки по три строки. Вот что делает каждая строка:

  1. Первая строка устанавливает переменную среды (PYENV_ROOT), которая указывает на каталог pyenv.
  2. Вторая строка помещает pyenv на первое место в вашем пути поиска, чтобы ОС находила Python (ы) pyenv раньше любых других Python.
  3. Последняя строка инициализирует pyenv каждый раз, когда вы открываете терминал.
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zprofile

Если вы используете другую оболочку, вы, вероятно, знаете, где находится конфигурация вашего профиля. Обновите приведенные выше команды, чтобы они указывали на конфигурацию вашего профиля (например, ~/.bash_profile, если вы используете bash).

Шаг 4. Используйте новую конфигурацию профиля

Хотя мы обновили конфигурацию профиля, изменения не повлияли на текущую запущенную оболочку. Чтобы они вступили в силу, либо закройте терминал и запустите новый, либо выполните эту команду:

$ exec "$SHELL"

Часть 3: Установка версий Python

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

После установки версии Python вы можете использовать ее в проектах. Например, предположим, что у вас установлено пять версий Python и вы работаете над 10 проектами. Каждый из проектов может выбирать и переключаться между любой из версий Python.

Попался 1: правильная установка

Если вы не выполнили в точности описанные выше действия по установке pyenv, вы можете заметить, что pyenv ведет себя забавно. Вот лишь несколько примеров проблем, на которые стоит обратить внимание.

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

Пример 2: представьте, что вы установили версию Python для проекта с помощью pyenv. Затем вы проверяете версию Python с помощью python --version и получаете другую версию, например версию системы Mac. ОС не находит Pythons pyenv до системной версии. Ваша установка неверна.

Если у вас возникли проблемы с бесперебойной работой pyenv, дважды проверьте свою установку и, в частности, конфигурацию вашего профиля (например, ~/.zprofile или ~/.bash_profile). Кроме того, если вы обновили свой профиль, но еще не загрузили его, или открыли новое окно, чтобы загружался только что отредактированный профиль, вам необходимо это сделать.

Попался 2: Предпосылки

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

Во-первых, pyenv нужен zlib. Вы можете установить zlib как часть инструментов разработчика Apple Mac. Эта команда загрузит инструменты из Apple и установит их:

$ xcode-select --install

Во-вторых, вам также понадобится пара пакетов, которые можно установить с Homebrew, openssl и readline. Их легко установить с помощью простой команды:

$ brew install openssl readline sqlite3 xz zlib

Однако не каждая версия Python совместима со всеми версиями этих пакетов. Последние версии стандартного Python должны нормально работать с последней версией openssl. Но если у вас возникли проблемы с установкой более старой или менее распространенной версии Python, вам может потребоваться поиграться с установкой конкретной версии openssl. Это синтаксис для установки определенной версии пакета с Homebrew:

$ brew install [email protected]

Попытка 3: пакеты разработки на Python

Стандартный способ установки версии Python, показанный ниже, будет работать в большинстве ситуаций. Однако в определенных ситуациях, например при использовании PyInstaller, вы можете столкнуться с этой ошибкой:

OSError: Python library not found: .Python, libpython3.6m.dylib, libpython3.6.dylib, Python
    This would mean your Python installation doesn't come with proper library files.
    This usually happens by missing development package, or unsuitable build parameters of Python installation.
* On Debian/Ubuntu, you would need to install Python development packages
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)

Это означает, что вам нужно установить свою версию Python особым образом. На Mac используйте эту команду:

$ env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.5.0

Установить версию Python

После всех настроек установить конкретную версию Python очень просто:

$ pyenv install 3.7.6

Вы также можете увидеть все версии и варианты, которые может установить pyenv - на момент написания этой статьи доступно 395:

$ pyenv install --list

Вы также можете увидеть свою текущую версию по умолчанию (то есть версию, которую вы будете использовать, если просто наберете python) и какие версии Python вы уже установили:

$ pyenv versions
  system
  2.7.17
  3.5.9
  3.6.10
  3.7.6
* 3.8.1 (set by /Users/usario/proj1/.python-version)

Попался 3: перефразировать

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

Если это объяснение все еще неясно, этот пример может помочь. Представьте, что у вас установлено несколько версий Python, и для каждой из них установлена ​​собственная версия pytest. Чтобы быть уверенным, что когда вы вводите pytest в командной строке, вы переходите к правильному двоичному файлу pytest в правильной версии Python, pyenv должен четко понимать. Это делается с помощью хешей.

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

$ pyenv rehash

Часть 4: Использование pyenv

Вы добрались до четвертой части. Поздравляем!

Уровни, на которых установлены версии Python

Используя pyenv, вы можете установить версии Python на трех уровнях.

  1. Global - устанавливает версию (и) Python для всех оболочек и каталогов, для которых никакая другая версия не установлена.
  2. Локальная - устанавливает версию (и) Python в каталоге и его подкаталогах (если локальная версия не указана в подкаталогах).
  3. Оболочка - устанавливает версию (и) Python для текущей оболочки с помощью переменной среды (PYENV_VERSION).

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

Оболочка - переопределения → Локальные - переопределения → Глобальные

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

Чтобы установить версии Python с помощью pyenv, следуйте этому формату:

$ pyenv <level> <version> [<version>]*

Пожалуй, лучшая команда - самая простая:

$ pyenv local 2.7.17
$ python --version
Python 2.7.17

Вы можете установить версию Python только для установленной версии Python. Инструкции по установке версий см. В предыдущей части этой статьи, Установка версий Python. Чтобы увидеть установленные версии Python, используйте эту команду:

$ pyenv versions
  system
  2.7.17
  3.5.9
  3.6.10
  3.7.6
* 3.8.1 (set by /Users/usario/proj1/.python-version)

Затем вы можете установить версию Python на любую из установленных версий на любом из трех уровней:

$ pyenv shell 3.5.9
$ pyenv local 2.7.17
$ pyenv global 3.8.1
$ python --version

Какая версия будет отображаться?

Несколько версий одновременно

Если вы установите несколько версий на один и тот же уровень, по умолчанию будет первая версия. Другими словами, если вы выполните python --version без квалификации, вы будете использовать версию по умолчанию. Вы можете обратиться к другим установленным версиям, указав команду python. Например, если вы установите две версии Python (например, 2.7.17 и 3.5.9), первая версия (2.7.17) будет по умолчанию, но вы можете ссылаться на вторую версию с python3.5:

$ pyenv local 2.7.17 3.5.9
$ python --version
Python 2.7.17
$ python3.5 -- version
Python 3.5.9

Быстрое переключение версий Python

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

$ python --version
Python 2.7.17
$ time pyenv local 3.5.9
real 0m0.120s
user 0m0.017s
sys 0m0.030s
$ python --version
Python 3.5.9

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

Подписывайтесь на нас в Twitter 🐦 и Facebook 👥 и Instagram 📷 и присоединяйтесь к нашим Facebook и Linkedin Группы 💬 .

Чтобы присоединиться к нашему чату команды Slack в сообществе 🗣️ прочтите наши еженедельные темы о Фавнах 🗞️, и присоединитесь к сообществу 📣 нажмите здесь⬇

Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку хлопка 👏 ниже, чтобы выразить поддержку автору! ⬇