Как установить Python 3 на macOS в качестве версии по умолчанию

Перевод статьи «The right and wrong way to set Python 3 as default on a Mac».

Есть несколько способов начать работу с Python 3 на macOS, однако не все они одинаково хороши. Сегодня мы рассмотрим, как правильно настроить среду, не нарушая ничего, встроенного в операционную систему macOS.

1. Установите pyenv

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

Как нам перестать заботиться о том, какая версия Python используется по умолчанию? Нужно использовать pyenv. Это инструмент для управления несколькими версиями Python. Он простой и вполне соответствует традициям Unix: предназначен для решения одной задачи, и решает ее хорошо.

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

$ brew install pyenv
?  /usr/local/Cellar/pyenv/1.2.10: 634 files, 2.4MB

2. Установите Python

Теперь давайте установим последнюю версию Python (здесь указана версия 3.7.3, однако на данный момент широко используется версия 3.8 и доступна версия 3.9):

$ pyenv install 3.7.3
python-build: use openssl 1.0 from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.3.tar.xz...
-> https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
Installing Python-3.7.3...
## дальнейший вывод не включен ##

3. Установите глобальное значение по умолчанию

Теперь, когда Python 3 установлен через pyenv, мы хотим установить его как нашу версию по умолчанию (глобально) для сред pyenv:

$ pyenv global 3.7.3
# проверим, сработало ли
$ pyenv version
3.7.3 (set by /Users/mbbroberg/.pyenv/version)

Сила pyenv основана на том, что он контролирует путь нашей оболочки. Чтобы он работал правильно, нам нужно добавить следующее в наш файл конфигурации (мы использовали .zshrc, а вам, возможно, подойдет .bash_profile):

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

После этой команды наш файл (.zshrc для zsh или .bash_profile для Bash) должен включать следующие строки:

if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi

Теперь мы точно знаем, что используем Python 3.7.3, и pip будет обновляться вместе с ним без какой-либо ручной настройки и конфликтов между версиями. Использование менеджера версий (pyenv) позволяет нам легко регулировать будущие обновления, не беспокоясь о том, какую версию Python мы используем в данный момент.

Успешный результат

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

Для управления зависимостями также важно использовать виртуальные среды. Тут нам пригодятся такие встроенные библиотеки, как venv и virtualenvwrapper.

Среда выполнения Python

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

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

Многие пользователи держат десятки интерпретаторов Python на своих компьютерах, хотя понятия не имеют, как эффективно ими управлять.

Слишком часто люди просто загружают последнюю версию Python, помещают ее в свою переменную $PATH и на этом всё (или используют команду brew install python3, которая делает примерно то же самое). Это может привести к поломкам и неисправностям, которые будет весьма сложно исправить.

Чего не стоит делать

Можно подумать, что, чтобы сделать Python 3 на macOS версией по умолчанию, нужно заменить старую версию и на новую:

# для начала найдем бинарный файл python
$ which python
/usr/bin/python
# затем переименуем его, задав неиспользуемое имя
$ sudo mv /usr/bin/python /usr/bin/python2
# наконец, переместим на предыдущий путь новый бинарный файл
$ sudo mv $PATHTOBINARY/python3 /usr/bin/python

Этот шаблон соответствует тому, что обычно делает /usr/bin/ между основными выпусками Python, однако это неправильный ход:

$ sudo mv /usr/bin/python /usr/bin/python2
mv: rename /usr/bin/python to /usr/bin/python2: Operation not permitted

К счастью, macOS не дает сломать систему непродуманными действиями. Дальнейшие исследования вопроса показывают, что описанный выше способ не следует применять.

Что можно попробовать

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

Использовать Python 3 по умолчанию для macOS

На веб-сайте Python есть установщик macOS Python 3, который мы можем загрузить и использовать. Если мы воспользуемся установкой пакета, python3 будет доступен в /usr/local/bin/.

Поскольку двоичный файл Python, хранящийся в /usr/bin/, не может быть изменен, необходимы алиасы (псевдонимы). Что хорошо в псевдониме, так это то, что он специфичен для нашей оболочки командной строки. Поскольку по умолчанию мы используем zsh, мы помещаем в файл .zshrc следующее:

$ echo "alias python=/usr/local/bin/python3.7" >> ~/.zshrc

Если по умолчанию вы используете оболочку Bash, вы можете добавить следующий текст в свой .bashrc:

$ echo "alias python=/usr/local/bin/python3.7" >> ~/.bashrc

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

Доверить управление Homebrew

Проект Homebrew предоставляет бесплатный менеджер пакетов для macOS, на который полагаются многие люди. Он имеет открытый исходный код. Этот менеджер пакетов дает пользователям Apple возможности, аналогичные возможностям apt-get или yum.

Если вы являетесь пользователем Homebrew, возможно, у вас уже установлен Python. Чтобы быстро проверить это, запустите конвейер команд:

$ brew list | grep python
python

Если в качестве результата вы получите python, значит, он установлен. Но какая это версия? Давайте проверим:

$ brew info python
python: stable 3.7.3 (bottled), HEAD
Interpreted, interactive, object-oriented programming language
https://www.python.org/
/usr/local/Cellar/python/3.7.2_1 (8,437 files, 118MB) *
## дальнейший вывод не включен ##

Отлично! Мейнтейнеры Homebrew обновили Python bottle (бинарный пакет), чтобы он указывал на последний релиз. Поскольку мейнтейнеры Homebrew более ответственны в отношении обновления релиза, чем большинство из нас, мы можем использовать версию Python 3 от Homebrew с помощью следующей команды:

$ brew update && brew upgrade python

Теперь нам нужно, чтобы наш алиас указывал на копию Python, которой управляет Homebrew:

# Если вы добавляли предыдущий алиас, используйте текстовый редактор, чтобы обновить строку
alias python=/usr/local/bin/python3

Чтобы убедиться, что приведенный выше путь указывает на то место, куда Homebrew установил Python в нашей среде, мы можем запустить brew info python и поискать информацию о пути.

Этот метод использования Homebrew для управления нашей средой Python является хорошей отправной точкой.

Что делать, если нам все еще нужен Python 2?

Для любого новичка в Python имеет смысл начинать сразу с Python 3. Но те из нас, кому все еще нужен Python 2 – например, для участия в проекте, где есть только Python 2, – могут продолжать использовать версию Python, доступную в macOS по умолчанию (путь — /usr/bin/python):

$ /usr/bin/python
>>> print("This runtime still works!")
This runtime still works!

Homebrew настолько хорош, что даже предлагает другую формулу для Python 2:

# Если вам нужен Python 2.7, запустите
$ brew install python@2

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

Не забудьте обновить pip до версии pip3!

pip – это дефолтный менеджер пакетов Python. Хотя мы изменили нашу дефолтную команду python на третью версию, нужно также отдельно задать псевдоним нашей команде pip (если у нас предыдущая версия).

Для начала нужно проверить, какая, собственно, у нас версия:

# Обратите внимание, что буква V - заглавная
$ pip -V
pip 19.0.3 from /Library/Python/2.7/site-packages/pip-19.0.3-py2.7.egg/pip (python 2.7)

Чтобы устанавливать пакеты, наверняка совместимые с нашей новой версией Python, мы используем еще один алиас, указывающий на совместимую версию pip.

Поскольку в данной ситуации мы используем Homebrew в качестве менеджера пакетов, мы знаем, что он установил pip3 при установке Python 3. Путь по умолчанию должен быть таким же, как и в Python 3, но мы можем проверить это, попросив оболочку найти его:

$ which pip3
/usr/local/bin/pip3

Теперь, когда мы точно знаем местоположение, мы добавим его в наш файл конфигурации оболочки, как мы это делали раньше:

$ echo "alias pip=/usr/local/bin/pip3" >> ~/.zshrc 
# для Bash:
$ echo "alias pip=/usr/local/bin/pip3" >> ~/.bashrc

Наконец, мы можем проверить, что запущенный pip указывает на pip3. Для этого нужно открыть новую оболочку или перезагрузить текущую и посмотреть, на сто указывает псевдоним:

# Эта команда перезагружает текущую оболочку без выхода из сессии
# Альтернативный вариант - выйти из оболочки и начать новую сессию
$ exec $0
# Теперь мы можем посмотреть, куда указывает pip
$ which pip
pip: aliased to /usr/local/bin/pip3

Мы можем избежать использования Homebrew для обновления pip, но для этого потребуется гораздо более подробное руководство, основанное на документации Python.

Заключение

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

Установка Python 3 с Homebrew или без него и использование псевдонима позволят вам начать программировать, но в долгосрочной перспективе это не лучшая стратегия.

Использование pyenv — простое решение для управления версиями. Оно станет отличной отправной точкой.