Установка Python 3.13 на Debian 13, 12 и 11

💡 Зачем это нужно — Python 3.13 уже встроен в Debian 13 (Trixie) и устанавливается одной командой через APT. Но если вы работаете на Debian 12 (Bookworm) или Debian 11 (Bullseye), то в официальных репозиториях его нет. Мы рассмотрим оба варианта: быструю установку через APT для Trixie и безопасную сборку из исходников для более старых версий.

⚠️ Важное предупреждение: Debian использует свой Python для системных утилит и APT. Никогда не удаляйте и не заменяйте системный Python (/usr/bin/python3). Всегда используйте версионные команды (python3.13) и виртуальные окружения.

Оглавление

Предварительные требования

Прежде чем начать, убедитесь, что ваша система готова:

⚠️ ВАЖНО: Проверьте права sudo перед установкой

Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:

sudo whoami

Что делает:

  • sudo — выполняет команду от имени суперпользователя
  • whoami — показывает имя текущего пользователя

Зачем: Проверяет, может ли ваш пользователь выполнять команды с правами root.

✅ Если выводит root — всё в порядке, можете продолжать.

❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.

Дополнительные требования:

  • Для APT-установки (Debian 13): Debian 13 (Trixie) с доступом в интернет
  • Для сборки из исходников (Debian 12/11): ~2-3 ГБ свободного места, интернет
  • Общее: Понимание разницы между системным Python и пользовательским

Выбор метода установки Python 3.13

МетодДля каких версий DebianОткуда берётсяКак обновляетсяКогда использовать
APT-пакет DebianТолько Debian 13
(Trixie)
Репозитории DebianЧерез APT
(автоматически)
Рекомендуется для
Trixie — стандартная
установка
Сборка из
исходников
Debian 12, Debian 11
(опционально Debian 13)
Python.orgВручную через
скрипт
Когда нужна точная
версия 3.13.x на
старых Debian
Testing/unstable или
PPA
Не для stableСторонние источникиНе рекомендуетсяИзбегайте
сломает систему

💡 Особенность Debian 13: В Trixie пакет python3.13 уже есть в репозиториях, но он может отставать от последней минорной версии от Python.org. Если вам нужна самая свежая 3.13.x — используйте сборку из исходников с отдельным префиксом.

Что нужно знать перед установкой (правила безопасности)

Чтобы не повредить Debian, соблюдайте эти правила:

ПравилоПочему это важно
Запускайте Python командой python3.13Системный python3 принадлежит Debian — не трогайте его
Используйте виртуальные окружения (venv)pip не будет писать в системные директории
Сборка использует make altinstallУстанавливает в /usr/local/python3.13, а не поверх
системного
Не создавайте update-alternatives для python3Это заменит системный интерпретатор
Не удаляйте системный PythonБез него перестанут работать APT и утилиты

Проверка вашей версии Debian

. /etc/os-release
printf '%s\n' "$PRETTY_NAME"

Что делает: Показывает точное название вашей версии Debian.

python3 --version

Что делает: Показывает версию системного Python.

python3.13 --version 2>/dev/null || echo "Python 3.13 не установлен"

Что делает: Проверяет, не установлен ли уже Python 3.13.

Ожидаемые выводы:

Debian 13 (Trixie)Debian 12 (Bookworm)Debian 11 (Bullseye)
Debian GNU/Linux 13 (trixie)Debian GNU/Linux 12 (bookworm)Debian GNU/Linux 11 (bullseye)
Python 3.13.5Python 3.11.2Python 3.9.2
Python 3.13.5 (уже установлен)Python 3.13 не установленPython 3.13 не установлен

Метод 1: Установка Python 3.13 через APT (только Debian 13)

Этот метод работает только на Debian 13 (Trixie). Если у вас Debian 12 или 11 — переходите к Методу 2.

Шаг 1: Обновление системы

sudo apt update

Что делает: Обновляет список доступных пакетов.

Шаг 2: Установка Python 3.13 и дополнительных пакетов

sudo apt install -y python3.13 python3.13-venv python3.13-dev

Что делает:

  • python3.13 — сам интерпретатор
  • python3.13-venv — модуль для создания виртуальных окружений
  • python3.13-dev — заголовочные файлы для компиляции C-расширений

Зачем: venv и dev нужны не всегда, но лучше установить сразу — они пригодятся для разработки.

Шаг 3: Проверка установки

python3.13 --version

Ожидаемый вывод: Python 3.13.x (где x — версия из репозиториев Debian).

python3.13 -c "import ssl, sqlite3, bz2, lzma, zlib, ctypes, readline; print('Python 3.13 готов на Debian')"

Что делает: Проверяет, что основные модули стандартной библиотеки работают.

Ожидаемый вывод: Python 3.13 готов на Debian

Метод 2: Установка Python 3.13 из исходников (Debian 12, 11 или опционально Debian 13)

Этот метод подходит для Debian 12, Debian 11, а также для Debian 13, если вам нужна самая свежая минорная версия от Python.org.

Подготовка Debian к сборке

Шаг 1: Обновление системы

sudo apt update

Шаг 2: Установка инструментов сборки и зависимостей

sudo apt install -y ca-certificates wget python3 build-essential zlib1g-dev libncurses-dev \
libgdbm-dev libgdbm-compat-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev \
libffi-dev libbz2-dev liblzma-dev uuid-dev libexpat1-dev tk-dev pkg-config make libdb-dev

Что делает: Устанавливает компилятор gcc, заголовочные файлы и библиотеки, необходимые для сборки Python со всеми модулями.

Зачем: Без этих пакетов Python соберётся с минимальной функциональностью — модули ssl, sqlite3, tkinter и другие будут отсутствовать.

Шаг 3: Проверка свободного места

df -h "$HOME" /usr/local

Что делает: Показывает свободное место в домашней директории и /usr/local.

Зачем: Сборка требует несколько гигабайт свободного места (~2-3 ГБ).

Создание скрипта-помощника для сборки

Вместо выполнения десятка команд вручную, мы создадим скрипт, который автоматически:

  1. Найдёт последнюю версию Python 3.13 на python.org
  2. Скачает исходники и проверит их SHA-256 контрольную сумму
  3. Соберёт Python с оптимальными настройками
  4. Установит его в /usr/local/python3.13
  5. Создаст символическую ссылку /usr/local/bin/python3.13

Создание файла скрипта

cat <<'EOF' > install-python313-source-debian.sh
#!/usr/bin/env bash
# UnishellRu Python 3.13 source helper
set -euo pipefail

INSTALL_PREFIX="${INSTALL_PREFIX:-/usr/local/python3.13}"
BUILD_DIR="${BUILD_DIR:-$HOME/python3.13-source-build}"
PY313_COMMAND_NAME="${PY313_COMMAND_NAME:-python3.13}"
PY313_BIN="$INSTALL_PREFIX/bin/python3.13"
PY313_FORCE_REBUILD="${PY313_FORCE_REBUILD:-0}"

validate_settings() {
    if [[ -z "$INSTALL_PREFIX" || "$INSTALL_PREFIX" != /* ]]; then
        printf 'INSTALL_PREFIX must be an absolute path.\n' >&2
        exit 1
    fi

    if [[ -z "$PY313_COMMAND_NAME" || "$PY313_COMMAND_NAME" == */* || "$PY313_COMMAND_NAME" =~ [[:space:]] ]]; then
        printf 'PY313_COMMAND_NAME must be a command name, not a path or a value with spaces.\n' >&2
        exit 1
    fi
}

require_cmd() {
    if ! command -v "$1" >/dev/null 2>&1; then
        printf 'Missing required command: %s\n' "$1" >&2
        exit 1
    fi
}

validate_settings

for cmd in python3 awk; do
    require_cmd "$cmd"
done

mkdir -p "$BUILD_DIR"

require_link_cmds() {
    for cmd in sudo readlink grep mktemp install ln; do
        require_cmd "$cmd"
    done
}

require_build_cmds() {
    for cmd in wget tar make gcc sha256sum nproc tail; do
        require_cmd "$cmd"
    done
    require_link_cmds
}

is_managed_wrapper() {
    local path="$1"
    local target="$2"
    [ -f "$path" ] && grep -Fqx '# UnishellRu Python 3.13 source wrapper' "$path" && grep -Fqx "PY313_SOURCE_TARGET='$target'" "$path"
}

write_command_wrapper() {
    local target="$1"
    local link="$2"
    local tmp_file=""

    tmp_file="$(mktemp)"
    {
        printf '%s\n' '#!/usr/bin/env sh'
        printf '%s\n' '# UnishellRu Python 3.13 source wrapper'
        printf "PY313_SOURCE_TARGET='%s'\n" "$target"
        # shellcheck disable=SC2016
        printf '%s\n' 'exec "$PY313_SOURCE_TARGET" "$@"'
    } >"$tmp_file"
    sudo install -m 0755 "$tmp_file" "$link"
    rm -f "$tmp_file"
}

check_command_target_safe() {
    local target="$1"
    local link="/usr/local/bin/$PY313_COMMAND_NAME"
    local existing_path=""
    local existing_target=""

    if existing_path="$(command -v "$PY313_COMMAND_NAME" 2>/dev/null)"; then
        existing_target="$(readlink -f "$existing_path" 2>/dev/null || true)"
        if [ -n "$existing_target" ] && [ "$existing_target" != "$target" ] && ! is_managed_wrapper "$existing_path" "$target"; then
            printf 'Refusing to shadow existing %s at %s\n' "$PY313_COMMAND_NAME" "$existing_path" >&2
            printf 'Set PY313_COMMAND_NAME to a separate name, such as python3.13-upstream, when another package owns the command.\n' >&2
            exit 1
        fi
    fi

    if [ -e "$link" ] && [ ! -L "$link" ] && ! is_managed_wrapper "$link" "$target"; then
        printf 'Refusing to overwrite unmanaged path: %s\n' "$link" >&2
        exit 1
    fi
}

install_command_link() {
    local target="$1"
    local link="/usr/local/bin/$PY313_COMMAND_NAME"

    check_command_target_safe "$target"

    if [ "$PY313_COMMAND_NAME" = "python3.13" ]; then
        sudo ln -sfn "$target" "$link"
    else
        write_command_wrapper "$target" "$link"
    fi
}

fetch_release_metadata() {
    python3 - <<'PY'
import gzip
import re
from urllib.request import urlopen

release_html = urlopen("https://www.python.org/downloads/latest/python3.13/", timeout=20).read()
if release_html.startswith(b"\x1f\x8b"):
    release_html = gzip.decompress(release_html)
release_html = release_html.decode("utf-8")

version_match = re.search(r'<h1 class="page-title">Python (3\.13\.\d+)</h1>', release_html)
if not version_match:
    raise SystemExit("Could not find the latest Python 3.13 release version")
version = version_match.group(1)

row = re.search(
    r'<td>\s*<td><a href="(?P<url>[^"]*Python-' + re.escape(version) + r'\.tar\.xz)">XZ compressed source tarball</a></table>.*?<code class="checksum">(?P<checksum>.*?)</code>',
    release_html,
    re.S,
)
if not row:
    raise SystemExit("Could not find the XZ source tarball checksum")

checksum_text = re.sub(r"<[^>]+>", "", row.group("checksum"))
sha256 = re.sub(r"[^0-9a-f]", "", checksum_text)
if len(sha256) != 64:
    raise SystemExit(f"Unexpected SHA-256 checksum length: {len(sha256)}")

print(f"PY313_VERSION='{version}'")
print(f"PY313_URL='{row.group('url')}'")
print(f"PY313_SHA256='{sha256}'")
PY
}

run_logged() {
    local label="$1"
    shift
    local log_file="$BUILD_DIR/${label}-${PY313_VERSION}.log"
    if "$@" >"$log_file" 2>&1; then
        printf '%s complete; see %s\n' "$label" "${label}-${PY313_VERSION}.log"
    else
        printf '%s failed; last log lines:\n' "$label" >&2
        tail -n 50 "$log_file" >&2 || true
        exit 1
    fi
}

metadata_file="$BUILD_DIR/python313-release.env"
fetch_release_metadata >"$metadata_file"
# shellcheck source=/dev/null
. "$metadata_file"

printf 'Using Python %s\n' "$PY313_VERSION"

if [ -x "$PY313_BIN" ]; then
    current_version="$("$PY313_BIN" --version | awk '{print $2}')"
    if [ "$current_version" = "$PY313_VERSION" ] && [ "$PY313_FORCE_REBUILD" != "1" ]; then
        require_link_cmds
        install_command_link "$PY313_BIN"
        printf 'Python %s already installed at %s\n' "$current_version" "$PY313_BIN"
        exit 0
    fi
fi

require_build_cmds
check_command_target_safe "$PY313_BIN"

cd "$BUILD_DIR"
archive="Python-${PY313_VERSION}.tar.xz"
srcdir="Python-${PY313_VERSION}"

sudo rm -rf -- "$srcdir"
rm -f -- "$archive"
wget -q -O "$archive" "$PY313_URL"
printf '%s  %s\n' "$PY313_SHA256" "$archive" | sha256sum -c -
tar -xf "$archive"

cd "$srcdir"
configure_args=(--with-ensurepip=install "--prefix=$INSTALL_PREFIX")
if [ -n "${PY313_CONFIGURE_EXTRA:-}" ]; then
    # shellcheck disable=SC2206
    extra_args=($PY313_CONFIGURE_EXTRA)
    configure_args+=("${extra_args[@]}")
fi

run_logged configure ./configure "${configure_args[@]}"
run_logged make make -j"$(nproc)"
run_logged altinstall sudo make altinstall

printf '%s\n' "$INSTALL_PREFIX/lib" | sudo tee "/etc/ld.so.conf.d/${PY313_COMMAND_NAME}.conf" >/dev/null
sudo ldconfig

if [ -x "$PY313_BIN" ]; then
    install_command_link "$PY313_BIN"
    "$PY313_BIN" --version
    cd "$BUILD_DIR"
    sudo rm -rf -- "$srcdir"
    rm -f -- "$archive"
else
    printf 'Build completed, but %s was not found.\n' "$PY313_BIN" >&2
    exit 1
fi
EOF

Что делает этот скрипт (обзорно):

  • Проверяет наличие всех необходимых команд
  • Скачивает с python.org страницу последнего релиза Python 3.13 и SHA-256 контрольную сумму
  • Скачивает исходники и проверяет их целостность
  • Конфигурирует сборку с поддержкой всех модулей
  • Собирает Python, используя все ядра процессора
  • Устанавливает через make altinstall (безопасная установка)
  • Создаёт символическую ссылку в /usr/local/bin
chmod +x install-python313-source-debian.sh

Что делает: Делает скрипт исполняемым.

Запуск сборки Python 3.13

Для Debian 12 и Debian 11 (стандартная сборка)

./install-python313-source-debian.sh

Ожидаемый вывод:

Using Python 3.13.13
Python-3.13.13.tar.xz: OK
configure complete; see configure-3.13.13.log
make complete; see make-3.13.13.log
altinstall complete; see altinstall-3.13.13.log
Python 3.13.13

Сколько это займёт: На современном компьютере сборка занимает 5-15 минут.

Для Debian 13 (установка последней версии рядом с системной)

Если на Debian 13 вам нужна самая свежая минорная версия (например, 3.13.13, а в репозиториях 3.13.5):

INSTALL_PREFIX=/usr/local/python3.13-upstream \
PY313_COMMAND_NAME=python3.13-upstream \
./install-python313-source-debian.sh

Что делает: Устанавливает Python 3.13 в отдельный префикс с именем команды python3.13-upstream, не конфликтуя с системным пакетом.

Установка скрипта обновления

После успешной сборки (для Debian 12/11):

sudo install -m 0755 install-python313-source-debian.sh /usr/local/bin/update-python313-source

Что делает: Копирует скрипт в /usr/local/bin для удобного обновления.

Для Debian 13 с side-установкой создайте отдельный скрипт-обёртку:

sudo tee /usr/local/bin/update-python313-upstream >/dev/null <<'EOF'
#!/usr/bin/env bash
# UnishellRu Python 3.13 upstream update wrapper
export INSTALL_PREFIX=/usr/local/python3.13-upstream
export PY313_COMMAND_NAME=python3.13-upstream
exec /usr/local/bin/update-python313-source "$@"
EOF
sudo chmod 0755 /usr/local/bin/update-python313-upstream

Проверка установки (сборка из исходников)

Для Debian 12/11:

python3.13 --version

Ожидаемый вывод: Python 3.13.x (актуальная версия с python.org).

python3.13 -c "import ssl, sqlite3, bz2, lzma, zlib, ctypes, readline, tkinter, dbm.gnu, dbm.sqlite3; print('Python 3.13 готов')"

Ожидаемый вывод: Python 3.13 готов

Для Debian 13 (side-установка):

python3.13-upstream --version
python3.13-upstream -m pip --version

Использование Python 3.13 через виртуальное окружение

⚠️ Важнейшее правило: Никогда не устанавливайте пакеты через pip глобально. Всегда используйте виртуальные окружения.

Создание виртуального окружения

mkdir -p "$HOME/venvs"
python3.13 -m venv "$HOME/venvs/py313"

Что делает: Создаёт виртуальное окружение с Python 3.13.

Для side-установки на Debian 13:

python3.13-upstream -m venv "$HOME/venvs/py313-upstream"

Активация окружения

source "$HOME/venvs/py313/bin/activate"

Ожидаемое изменение приглашения: (py313) user@debian:~$

Установка пакетов внутри venv

python -m pip install --upgrade pip
python -m pip install requests

Что делает: Обновляет pip и устанавливает пакет requests только внутри виртуального окружения.

Проверка, что вы внутри venv

which python

Ожидаемый вывод: /home/username/venvs/py313/bin/python

Деактивация окружения

deactivate

Обновление Python 3.13

Обновление APT-пакета (Debian 13)

sudo apt update
sudo apt install --only-upgrade python3.13 python3.13-venv python3.13-dev

Обновление сборки из исходников

update-python313-source

Что делает: Проверяет последнюю версию на python.org и пересобирает, если нужно.

Для side-установки на Debian 13:

update-python313-upstream

Принудительная пересборка (если менялись зависимости или флаги):

PY313_FORCE_REBUILD=1 update-python313-source

Удаление Python 3.13

Удаление APT-пакета (Debian 13)

sudo apt remove python3.13-venv python3.13-dev

Что делает: Удаляет дополнительные пакеты, но оставляет сам интерпретатор (на всякий случай).

⚠️ Не удаляйте python3.13 на Debian 13 — он может понадобиться системе.

Удаление сборки из исходников

⚠️ Перед удалением: Убедитесь, что ни один проект не использует виртуальные окружения с этим Python.

# Удаление символических ссылок
sudo rm -f /usr/local/bin/python3.13
sudo rm -f /usr/local/bin/python3.13-upstream

# Удаление скриптов обновления
sudo rm -f /usr/local/bin/update-python313-source
sudo rm -f /usr/local/bin/update-python313-upstream

# Удаление самих установок Python
sudo rm -rf /usr/local/python3.13
sudo rm -rf /usr/local/python3.13-upstream

# Удаление конфигурации линковщика
sudo rm -f /etc/ld.so.conf.d/python3.13.conf
sudo rm -f /etc/ld.so.conf.d/python3.13-upstream.conf
sudo ldconfig

# Удаление директории со сборкой
sudo rm -rf "$HOME/python3.13-source-build"

# Удаление виртуальных окружений
rm -rf "$HOME/venvs/py313"
rm -rf "$HOME/venvs/py313-upstream"

# Очистка кэша команд
hash -r

Проверка:

command -v python3.13 || echo "Python 3.13 удалён"
python3 --version

Решение типичных проблем

8.1 Ошибка: APT не может найти пакет python3.13

Симптом: sudo apt install python3.13 выдаёт E: Unable to locate package python3.13.

Причина: Вы используете Debian 12 или 11, где нет этого пакета в официальных репозиториях.

Решение: Используйте Метод 2 (сборка из исходников). Не добавляйте testing/unstable или Ubuntu PPA.

8.2 Ошибка: Скрипт отказывается создавать python3.13 (shadow)

Симптом: Скрипт выводит Refusing to shadow existing python3.13 at /usr/bin/python3.13.

Причина: На Debian 13 уже есть системный пакет python3.13, и скрипт не хочет его заменять.

Решение: Используйте side-установку с другим именем:

INSTALL_PREFIX=/usr/local/python3.13-upstream \
PY313_COMMAND_NAME=python3.13-upstream \
./install-python313-source-debian.sh

8.3 Ошибка: pip не работает (ModuleNotFoundError)

Симптом: python3.13 -m pip --version выдаёт ModuleNotFoundError: No module named 'pip'.

Причина: Не установлен модуль venv.

Решение (Debian 13):

sudo apt install python3.13-venv
mkdir -p "$HOME/venvs"
python3.13 -m venv "$HOME/venvs/py313"
source "$HOME/venvs/py313/bin/activate"
python -m pip --version

Решение (Debian 12/11 сборка из исходников): Скрипт уже включает --with-ensurepip=install, pip должен быть. Проверьте путь:

/usr/local/python3.13/bin/pip3.13 --version

8.4 Ошибка: Missing modules после сборки (_ssl, _sqlite3 и др.)

Симптом: При импорте модуля (import ssl) получаете ModuleNotFoundError.

Причина: Не был установлен соответствующий -dev пакет до сборки.

Пошаговое решение:

Шаг 1: Установите недостающие заголовочные файлы:

sudo apt install libssl-dev libsqlite3-dev libbz2-dev liblzma-dev tk-dev -y

Шаг 2: Принудительно пересоберите Python:

PY313_FORCE_REBUILD=1 update-python313-source

⚠️ Важное примечание! Команда пересборки update-python313-source подойдёт только для Debian 12/11. Для side-установки на Debian 13 нужно использовать команду update-python313-upstream

8.5 Ошибка: Недостаточно памяти для сборки

Симптом: Процесс сборки прерывается с ошибкой «Cannot allocate memory» или «Killed».

Причина: На сервере меньше 2 ГБ ОЗУ, и процесс компиляции убивает OOM Killer.

Пошаговое решение:

Шаг 1: Проверьте доступную память:

free -h

Шаг 2: Добавьте swap (если нет или мало):

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Шаг 3: Сделайте swap постоянным:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

8.6 Ошибка: Debian Tools сломались после изменений Python

Симптом: APT или другие утилиты выдают ошибки, связанные с Python.

Причина: Был изменён или удалён системный /usr/bin/python3.

Пошаговое решение:

Шаг 1: Проверьте системный Python:

ls -l /usr/bin/python3
dpkg -S /usr/bin/python3

Шаг 2: Переустановите системные пакеты:

sudo apt install --reinstall python3 python3-minimal python3-apt -y

Шаг 3: Проверьте:

python3 --version
sudo apt update

Чек-лист: что проверить после установки

  • [ ] sudo whoami выводит root
  • [ ] python3 --version показывает системный Python (3.13 на Trixie, 3.11 на Bookworm, 3.9 на Bullseye)
  • [ ] python3.13 --version показывает Python 3.13 (если установлен)
  • [ ] python3.13 -c "import ssl, sqlite3, bz2, lzma, zlib" выполняется без ошибок
  • [ ] Виртуальное окружение создаётся: python3.13 -m venv /tmp/test-venv
  • [ ] Внутри venv работает pip install
  • [ ] (Debian 13 side) python3.13-upstream --version работает
  • [ ] (Debian 12/11) update-python313-source доступен

Заключение

Python 3.13 установлен на Debian. В зависимости от вашей версии системы:

  • Debian 13 (Trixie): Установка через APT — самый простой путь. Если нужны самые свежие минорные версии — используйте side-установку из исходников.
  • Debian 12 (Bookworm) и Debian 11 (Bullseye): Сборка из исходников — единственный безопасный способ получить Python 3.13 без риска для системы.

Что дальше:

💡 Важно: Всегда работайте через виртуальные окружения и никогда не заменяйте системный Python. Это гарантирует стабильность вашей Debian-системы.