Смена версий Python в серверной инфраструктуре

Раздел: Администрирование -> Управление версиями Python

Основные способы обновления Python

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

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

# Установка зависимостей для сборки Python (Ubuntu/Debian)
sudo apt update
sudo apt 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 python3-openssl

# Установка pyenv
curl https://pyenv.run | bash

# Добавление pyenv в PATH (в ~/.bashrc или ~/.zshrc)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

Python default version (версия python по умолчанию)

После этого команда pyenv install --list покажет доступные версии. Установка конкретной версии:

pyenv install 3.11.7
pyenv global 3.11.7  # установка глобальной версии по умолчанию
python --version     # проверка

Python update (обновление python)

Типичная проблема: при установке pyenv через curl может потребоваться перезагрузить оболочку или выполнить exec $SHELL. Если пакет python3-openssl не установлен, сборка Python завершится ошибкой “ModuleNotFoundError: No module named '_ssl'”. Решение – установить все зависимости из списка выше.

Для проекта используется локальная версия:

cd /path/to/project
pyenv local 3.10.12   # версия применится только к этой директории

Python last version (последняя версия python)

Как обновить Python через системный пакетный менеджер (apt, yum, brew)?

На дистрибутивах Linux можно воспользоваться репозиториями. Для Ubuntu – PPA deadsnakes, для CentOS – EPEL или IUS. Этот метод подходит, когда требуется одна системная версия и администратор хочет получать обновления через штатные средства.

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11

# Проверка
python3.11 --version

При этом системный Python 3.x не заменяется – создается отдельный исполняемый файл. Проблема: может отсутствовать pip, его нужно устанавливать отдельно:

sudo apt install python3.11-distutils python3.11-dev
wget https://bootstrap.pypa.io/get-pip.py
python3.11 get-pip.py

Ошибка “E: Unable to locate package python3.11” означает, что PPA не добавлен или неверное имя пакета. Для Fedora/RHEL используется dnf install python3.11 из репозитория EPEL.

Как установить новую версию Python из исходного кода (make altinstall)?

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

wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz
tar -xzf Python-3.12.2.tgz
cd Python-3.12.2
./configure --enable-optimizations --prefix=/usr/local/python3.12
make -j$(nproc)
sudo make altinstall   # altinstall не перезаписывает системный python3

/usr/local/python3.12/bin/python3.12 --version

Если make install использован вместо altinstall, системный Python может быть заменён, что нарушит работу ОС. Всегда используйте altinstall для установки в отдельную директорию.

Как обновить Python через conda (для научных вычислений)?

Conda – менеджер пакетов и окружений, популярный в Data Science. Позволяет сменить версию Python в существующем окружении.

conda create -n myenv python=3.11   # новое окружение
conda activate myenv
python --version

# Обновление Python в текущем окружении
conda install python=3.12
conda list | grep python

При обновлении Python через conda могут возникнуть конфликты зависимостей, если пакеты не имеют сборки под новую версию. Требуется выполнить conda update --all после обновления интерпретатора.

Как обновить Python на Windows с официального сайта?

Для Windows проще всего скачать установщик с python.org. Он заменяет предыдущую версию при установке с опцией “Install launcher for all users”.

# Командная строка (после установки)
py --list
py -3.12 -c "import sys; print(sys.version)"

Если установлено несколько версий, переменная PATH может указывать на старую. Рекомендуется использовать py лаунчер и утилиту pyenv-win для управления версиями.

Расширенные примеры управления версиями Python

В этом разделе приведены менее распространенные, но полезные сценарии обновления и переключения Python.

Использование pyenv совместно с virtualenv

pyenv имеет плагин pyenv-virtualenv для создания изолированных окружений с привязкой к версии Python.

Пример
# Установка плагина (через git)
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc

# Создание окружения с Python 3.11.7
pyenv virtualenv 3.11.7 myproject-3.11
pyenv activate myproject-3.11
pip install flask

# Деактивация и удаление
pyenv deactivate
pyenv uninstall myproject-3.11
(myproject-3.11) user@host:~$ python --version
Python 3.11.7
(myproject-3.11) user@host:~$ pip list
Package    Version
---------- -------
Flask      3.0.0
...

Проблема: после активации окружения может не сработать автоматическое переключение в папке проекта. Решение – создать файл .python-version с именем окружения (например, myproject-3.11) и pyenv сам активирует его при входе в директорию.

Сборка Python с дополнительными библиотеками (например, Tkinter)

При сборке из исходников можно включить или исключить компоненты.

Пример
wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz
tar -xf Python-3.10.13.tar.xz
cd Python-3.10.13
./configure --enable-optimizations \
            --with-tcltk-includes='-I/usr/include/tcl8.6 -I/usr/include/tk8.6' \
            --with-tcltk-libs='-ltcl8.6 -ltk8.6' \
            --prefix=/opt/python3.10
make -j$(nproc)
sudo make altinstall

# Проверка наличия tkinter
/opt/python3.10/bin/python3.10 -m tkinter
(появится окно с демонстрацией Tk)

Если Tcl/Tk не установлены, конфигурация завершится с ошибкой. Установка: sudo apt install tcl-dev tk-dev.

Обновление Python внутри Docker-контейнера

Многоэтапная сборка с заменой версии интерпретатора для оптимизации размера образа.

Пример
# Dockerfile
FROM python:3.11-slim AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential libssl-dev zlib1g-dev libffi-dev

FROM builder AS final
COPY --from=python:3.12.2 /usr/local /usr/local
ENV PATH=/usr/local/bin:$PATH
CMD ["python3", "--version"]
$ docker build -t python-upgrade .
$ docker run python-upgrade
Python 3.12.2

Такой подход заменяет системный Python внутри контейнера без пересборки всех зависимостей. Однако может возникнуть несовместимость библиотек, собранных под старую версию. Рекомендуется использовать официальные образы с разными тегами и обновлять их через docker pull.

Установка Python через asdf (альтернатива pyenv)

Asdf – менеджер версий, поддерживающий множество языков. Установка Python через asdf.

Пример
# Установка asdf
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
source ~/.bashrc

# Добавление плагина Python
asdf plugin add python

# Установка версии
asdf install python 3.9.18
asdf global python 3.9.18

# Проверка
python --version
asdf list python
Python 3.9.18
3.9.18 (set by /home/user/.tool-versions)

Asdf удобен, если нужно управлять не только Python, но и Node.js, Ruby и т.д. Возможная проблема: плагин может не подхватить системные зависимости, требуется установка тех же пакетов, что и для pyenv.

Использование update-alternatives в Debian/Ubuntu

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

Пример
# Установка двух версий (например, 3.9 и 3.11) из разных источников
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2

# Выбор версии интерактивно
sudo update-alternatives --config python3

# Или автоматически
sudo update-alternatives --set python3 /usr/bin/python3.11

Метод работает только для системных установок Python, не подходит для изолированных окружений. При переключении могут сломаться скрипты, ожидающие определённую версию в /usr/bin/python3.

Обновление Python - comments

En
Python update (python)