Как устанавливать python в 2020

Автор фотографии – Sven Read

Казалось бы, странный вопрос – как устанавливать python в 2020? Берёшь и устанавливаешь, что здесь сложного? Как оказалось, нет. В диалогах с коллегами и друзьями часто выясняется, что они испытывают проблемы с установкой python, разными его версиями, управлением пакетами и виртуальными средами. Давайте сразу к делу. Во-первых разберёмся как НЕ нужно устанавливать python.

Как НЕ нужно устанавливать Python в 2020

Не нужно использовать версию из репозиториев

Речь идёт только о разработке на python. Если системным утилитам нужен python, то они, конечно, будут использовать версию из репозиториев. Собственно для этого она там и находится.

Если вы используете Ubuntu или Debian, НЕ устанавливайте python с помощью apt install. Если вы используете macOS, НЕ устанавливайте python с помощью brew install. Почему?

  1. У вас нет контроля над версией интерпретатора. Зачастую в репозиториях находится версия, отстающая от последней на один или два мажорных релиза.

  2. У вас нет контроля над обновлениями. Если завтра с очередным обновлением системы python обновится до версии 3.8, а используемая вами библиотека поддерживает только 3.6, вы ничего не сможете с этим сделать и библиотека окажется неработоспособной.

  3. Установка пакетов превращается в ад. Если вы используете python из репозитория, то и пакеты в первую очередь вам стоит искать там. Но пакетов там совсем мало и приходится использовать pip. pip install в этом случае использовать категорически нельзя, т.к. он будет устанавливать пакеты сразу для всей системы и при любом конфликте или ошибке установки все системные утилиты, зависящие от python окажутся неработоспособными. pip install --user использовать можно, но в этом случае все пакеты будут закинуты в одну гигантскую кучу, которую при любом конфликте придётся удалять и устанавливать заново. virtualenv решит эту проблему, но с первыми двумя пунктами он не поможет никак.

Не нужно компилировать python из исходников

По крайней мере, самому. Это долго и неэффективно.

Не нужно использовать установщик python с официального сайта

Этот способ долгий, не повторяется (версия может поменяться в любой момент) и не автоматизируется. Избегайте не автоматизирующейся работы.

Не нужно использовать Anaconda

Установка Anaconda ничем не лучше установки из репозитория, проблемы все те же, но чуть в меньшем масштабе. К тому же, conda – ужасно медленный и ненадёжный менеджер пакетов, который в текущем состоянии (май 2020) не стоит использовать никому и никогда, за исключением ситуаций когда у вас нет другого выбора.

Как нужно устанавливать Python в 2020

Используйте pyenv. Он решит все проблемы. Он позволяет собирать из исходников любую доступную версию CPython от 2.1.3 до 3.9.0 и линковать её только с теми модулями, которые вам нужны. Он умеет устанавливать PyPy, Anaconda, Jython и IronPython любой доступной версии. Он может из любой установленной версии создать изолированное виртуальное окружение, быстро его снести и переустановить, активировать его глобально для всей системы либо для отдельной директории.

Короче, pyenv решает все инфраструктурные проблемы с разработкой на python.

Как установить?

macOS

brew update
brew install pyenv pyenv-virtualenv

Linux

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

Настройка окружения

Если вы используете oh-my-zsh, то просто добавьте в plugins в ~/.zshrc pyenv.

Иначе, добавьте следующее в свой ~/.zshrc или ~/.bashrc:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

После этого необходимо перезагрузить shell.

Как использовать?

Посмотреть список всех доступных интерпретаторов для установки:

pyenv install --list

Если вам интересны только CPython 3.X:

pyenv install --list | grep "^\s*3"

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

pyenv install 3.8.2

Pyenv в этом случае скачает исходники выбранной версии и соберёт их. Если при этом он не сможет найти некоторые опциональные библиотеки (например zlib), он об этом предупредит, но установку не прервёт. Если в будущем вы столкнётесь с ошибкой, говорящей что python собран без поддержки чего-либо, установите нужную библиотеку и пересоберите интерпретатор. Либо можно заранее установить все библиотеки и не беспокоиться.

Таким образом вы можете собрать все необходимые вам версии интерпретаторов для всех ваших проектов.

Теперь необходимо создать из них виртуальные окружения. Скорее всего вам понадобится главное окружение, в котором всегда можно будет поэкспериментировать, установить любые библиотеки, а потом целиком его снести. Я обычно называю такое окружение main.

pyenv virtualenv 3.8.2 main
pyenv global main

Команда pyenv virtualenv принимает два аргумента: из чего создать и что создать. pyenv global делает выбранное окружение окружением по-умолчанию. После выполнения этой команды в prompt добавится (main).

Теперь вы можете засорять свою установку python как угодно, используйте для этого python -m pip install .... Если что-то пошло не по плану:

pyenv global system
pyenv uninstall main
pyenv virtualenv 3.8.2 main
pyenv global main

И можно пробовать снова.

Частая ситуация у python разработчика – 5 проектов, каждый из которых использует свою версию интерпретатора и свои пакеты. Решение – соберите нужные версии и создайте 5 виртуальных окружений.

Например, пусть у меня есть три проекта на python 3.6.3, один на python 3.8.1 и один на 2.7.3.

pyenv install 3.6.3
pyenv install 3.8.1
pyenv install 2.7.3

pyenv virtualenv 3.6.3 project-1
pyenv virtualenv 3.6.3 project-2
pyenv virtualenv 3.6.3 project-3

pyenv virtualenv 3.8.1 project-4

pyenv virtualenv 2.7.3 project-5

Надеюсь, принцип вы поняли. Если проекты вы разрабатываете в PyCharm, то просто найдите соответствующий интерпретатор в ~/.pyenv/versions и укажите его в качестве интерпретатора проекта.

Если вы не пользуетесь для разработки терминалом, то установите интерпретатор проекта с помощью pyenv local:

cd project-3
pyenv local project-3

(main) должен смениться на (project-3) только в этой директории. Дальше просто используйте python -m pip ... для управления пакетами и python -m ... для запуска ваших модулей.

Надеюсь, pyenv поможет вам легче и быстрее разрабатывать на python.