Выбор основной версии интерпретатора Python
Основные способы установки версии Python по умолчанию
Как сделать так, чтобы команда python всегда вызывала нужную версию?
Способ 1: update-alternatives (Debian/Ubuntu и производные)
Этот метод является наиболее системным и простым в поддержке. Он позволяет централизованно управлять альтернативами для исполняемых файлов.
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 2Python default version (версия python по умолчанию)
После регистрации альтернатив можно переключаться между ними:
sudo update-alternatives --config pythonPython update (обновление python)
Откроется меню, где выбирается номер версии. Текущая версия проверяется командой:
python --version
Python last version (последняя версия python)
Возможная проблема: Если после настройки команда python все еще указывает на старую версию, проверьте, не заблокирован ли путь в PATH, или не удалён ли файл python. Ошибка: «update-alternatives: error: no alternatives for python» – значит, не зарегистрирована ни одна альтернатива. Решение: убедиться, что пути к исполняемым файлам верны и повторить установку.
Цель: администратору, управляющему множеством серверов, требуется единая точка изменения версии Python для всех пользователей.
Как изменить версию Python только для своего пользователя?
Способ 2: символьная ссылка (symlink) в домашней директории
Создаётся символическая ссылка на нужный интерпретатор в каталоге ~/bin (предварительно добавленном в PATH).
mkdir -p ~/bin
ln -sf /usr/bin/python3.11 ~/bin/python
export PATH="$HOME/bin:$PATH"
Для постоянного использования строку export добавляют в ~/.bashrc или ~/.profile.
Возможная проблема: Если команда python продолжает использовать версию из /usr/bin, проверьте порядок в PATH. Ошибка: «python: command not found» после удаления ссылки – решение: создать новую ссылку или заново экспортировать PATH.
Цель: разработчику, которому нужна другая версия Python для одного проекта, не затрагивая остальных пользователей системы.
Как быстро переключаться между версиями без прав суперпользователя?
Способ 3: псевдоним (alias) в оболочке
В файл ~/.bashrc добавляется:
alias python='/usr/bin/python3.11'
Для вступления в силу команда source ~/.bashrc. Версия python будет использоваться только в интерактивных сессиях.
Возможная проблема: Псевдоним не работает в скриптах или в subshell. Решение: использовать симлинк или переменную PATH.
Цель: временное тестирование новой версии или быстрый доступ к старому интерпретатору.
Как задать версию Python для системы в целом без update-alternatives?
Способ 4: изменение PATH в глобальных профилях
В файл /etc/profile.d/python.sh добавляется:
export PATH="/usr/local/python3.11/bin:$PATH"
Затем дать права на выполнение и перелогиниться. Команда python берётся из первой директории в PATH.
Возможная проблема: Если в нескольких директориях присутствуют symlink с именем python, результат будет зависеть от порядка. Ошибка: «cannot execute binary file: Exec format error» – чаще всего из-за несовместимости архитектуры.
Цель: администратору, не желающему использовать механизм альтернатив, но требующему глобального изменения.
Как изолировать версии Python для разных проектов?
Способ 5: использование pyenv
pyenv позволяет устанавливать несколько версий Python и переключаться между ними локально для проекта.
pyenv install 3.11.2
pyenv global 3.11.2 # для всей системы пользователя
pyenv local 3.10.0 # для конкретной директории
Файл .python-version создаётся в корне проекта.
Возможная проблема: Если команда python не перенаправляется pyenv, проверьте eval "$(pyenv init -)" в ~/.bashrc. Ошибка: «pyenv: python: command not found (the latest version is ...)» – решение: выполнить pyenv rehash.
Цель: разработчикам, работающим над несколькими проектами с разными требованиями к версии Python.
Расширенные примеры настройки версии Python
Пример 1. Многопользовательская конфигурация через update-alternatives с приоритетами
Зарегистрируем три версии Python (3.9, 3.10, 3.11) так, чтобы автоматически выбиралась наиболее приоритетная.
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.9 10
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 20
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 30
Проверка текущей версии:
python --version Python 3.11.2
По умолчанию выбрана версия с наивысшим приоритетом (30). Если нужно временно её изменить, используется sudo update-alternatives --config python.
Пример 2. Переключение версий через pyenv для конкретного проекта и отслеживание зависимостей
Создаём проект с Python 3.9, устанавливаем зависимости, затем переключаемся на 3.11 и видим разницу.
cd ~/myproject
pyenv local 3.9.16
echo "print('Python 3.9')" > test.py
docker run python:3.9-alpine python test.py # вывод: Python 3.9
pyenv local 3.11.2
echo "import sys; print(sys.version)" > test.py
python test.py
3.11.2 (main, Dec 10 2023, 10:00:00) [GCC 12.2.0]
Обратите внимание: файл .python-version в корне проекта автоматически определяет, какой интерпретатор использовать при вызове python внутри директории.
Пример 3. Комбинирование symlink и виртуального окружения для тестирования
Создадим несколько виртуальных окружений с разными версиями Python, а для быстрого доступа настроим симлинк:
/usr/bin/python3.10 -m venv ~/venvs/venv310
/usr/bin/python3.11 -m venv ~/venvs/venv311
ln -sf ~/venvs/venv311/bin/python ~/bin/python3.11
Теперь, если активировать venv310, команда python внутри будет версии 3.10, а по symlink в ~/bin – версии 3.11.
source ~/venvs/venv310/bin/activate
python --version # Python 3.10.x
~/bin/python3.11 --version # Python 3.11.x
Пример 4. Использование модуля scl (Software Collections) для Red Hat/CentOS
Устанавливаем коллекцию rh-python38 и активируем её:
scl enable rh-python38 bash
python --version
Вывод:
Python 3.8.13
После выхода из оболочки версия возвращается к системной. Для постоянного включения можно добавить в ~/.bashrc: source /opt/rh/rh-python38/enable.
Пример 5. Установка версии Python только для выполнения скриптов через shebang
В начале скрипта указывается конкретный интерпретатор. System-wide это не меняет, но для автоматизации полезно:
#!/usr/bin/env python3.10
print('This script runs with Python 3.10')
Затем делается chmod +x script.py и запуск без указания версии. Shebang обеспечивает исполнение именно этой версии.