1 октября 2026 года Пабло Галиндо выпустил Python 3.10.22 и написал в блоге Python Insider, что это последний выпуск ветки 3.10. Через пять лет после 3.10.0 ветка закрыта: исправлений безопасности больше не будет, баги по ней тоже не принимают.
На практике это означает, что любая новая дыра в стандартной библиотеке, найденная после 1 октября, в 3.10 так и останется. Если на сервере на 3.10 крутится бот, сайт на Django или Flask, cron-скрипты, пора планировать переезд. Уже через месяц инструменты вокруг Python начали отходить от этой версии.
Python 3.10.22 стал последним выпуском
В 3.10.22 вошли исправления по tarfile, zipfile, ssl, urllib и встроенной libexpat, общие для всех пяти веток, которые вышли в тот же день: 3.10.22, 3.11.17, 3.12.15, 3.13.16 и 3.14.8. Выпуск только в исходниках, готовых установщиков для Windows и macOS нет. Последним 3.10 с установщиками был 3.10.11 в апреле 2023 года.
По PEP 619, графику выпусков 3.10, код ветки заморожен. Следующая на очереди 3.11: по словам разработчиков, она получает только исправления безопасности до октября 2027 года. 3.12 поддерживается до октября 2028, 3.13 до 2029, 3.14 до 2030, а вышедшая 9 октября 3.15 до 2031 года.
uv, Ruff и Django уже уходят с 3.10
Astral в заметке к выходу Python 3.15 пишет, что Ruff 0.17 теперь по умолчанию считает целевой версией 3.11, а не 3.10. Это касается проектов, где не задан свой target-version в настройках Ruff или requires-python в pyproject.toml. Сам uv продолжит работать с 3.10, но новых сборок этой версии больше не выпустит.
Самое неприятное видно в uv 0.13.5 от 21 октября. Это продолжение истории с ключами eMudhra и срочным обновлением pip: свежие 3.15.1, 3.14.9 и 3.13.17 получили pip 26.2.2 с очищенным набором сертификатов, а 3.9 и 3.10 так и поставляются со старым pip, который доверяет скомпрометированному корню eMudhra/emSign. Astral советует уходить с этих версий и перестала собирать Docker-образы с uv на Python 3.9 и 3.10.
У веб-разработчиков есть ещё одна причина. По таблице совместимости Django 3.10 поддерживает только Django 5.2, а Django 6.0, 6.1 и будущая 6.2 требуют Python 3.12 и новее. Проект на 3.10 застрял на 5.2, и при переезде логично сразу брать 3.12 или свежее.
Как найти Python 3.10 на сервере
Сначала системный интерпретатор, потом все виртуальные окружения. У каждого venv в корне лежит файл pyvenv.cfg, где записана версия Python, из которой оно создано. Обычный venv пишет строку version, uv пишет version_info, поэтому ищем обе:
python3 --version
sudo find / -name pyvenv.cfg -not -path '/proc/*' 2>/dev/null \
-exec grep -HE '^version(_info)? *= *3\.10' {} \;
Если сервисы живут в Docker, стоит посмотреть, на каких образах они собраны. Образы вида python:3.10-slim больше не получат исправлений самого Python:
docker images --format '{{.Repository}}:{{.Tag}}' | grep -i python
grep -rn --include=Dockerfile 'python:3.10' /srv /opt 2>/dev/null
Если Python 3.10 стоит из пакетов дистрибутива, дальнейшие исправления зависят уже от сопровождающих этого дистрибутива, а не от команды CPython.
Что сделать прямо сейчас и как переехать
Пока переезд не сделан, обновите pip во всех найденных окружениях на 3.10. pip 26.2.2 ещё ставится на 3.10 (в его требованиях указано Python 3.10 и новее), а вместе с ним приезжает certifi без корня eMudhra:
/path/to/venv/bin/python -m pip install --upgrade pip certifi /path/to/venv/bin/python -m pip --version
Сам переезд удобнее всего делать через uv: он скачает нужную версию Python, не трогая системную, и соберёт рядом новое окружение. Старое venv лучше не удалять, пока сервис не проверен на новом:
uv self update uv python install 3.14 cd /srv/myapp uv venv --python 3.14 .venv-314 uv pip install --python .venv-314 -r requirements.txt .venv-314/bin/python -m pytest # если есть тесты
После проверки переключите на новое окружение unit-файл systemd, cron или конфиг Gunicorn и поднимите минимальную версию в проекте, чтобы Ruff и uv подсказывали по новому синтаксису:
[project] requires-python = ">=3.12" [tool.ruff] target-version = "py312"
Переход с 3.10 обычно проходит спокойно: главное узнать заранее, какие зависимости уже не поддерживают новую версию, и обновить их до тех, что поддерживают. Если же проект на Django 5.2, есть смысл совместить переезд на 3.12+ с обновлением до Django 6.x.
Python 3.10 закрыт окончательно: 3.10.22 последний выпуск, а uv 0.13.5 и Ruff 0.17 уже отходят от этой версии. Найдите на сервере все окружения на 3.10, обновите в них pip как временную меру и переносите сервисы на 3.12 или новее, где поддержка продлится до 2028 года и дальше.
Как я проверил свой сервер
Пока писал эту заметку, пробежался по своему VPS, где крутятся python.domaintools.site, боты и MCP-сервисы. Системный интерпретатор сейчас Python 3.14.4, рядом лежит 3.12.3. Отдельного 3.10 в /usr/bin нет.
Все виртуальные окружения, которые нашлись через pyvenv.cfg, тоже уже не на 3.10: task-board-mcp и mail-mcp на 3.14.4, krivoshein-code-support, WordOps, max-support-bot и оба venv у python.domaintools.site на 3.12.3. В Docker висит только python:3.14-slim.
У сайта python.domaintools.site pip уже 26.2.2 с обновлённым certifi, то есть история с корнем eMudhra для него закрыта. В паре служебных окружений на 3.12 и 3.14 pip ещё старее, и их я тоже обновлю до 26.2.2, даже если Python там свежий: команда та же, что выше.
Если у вас на сервере find по pyvenv.cfg всё же покажет 3.10, не оставляйте эти окружения «на потом». Ветка закрыта, uv больше не даёт для неё Docker-образы, а Django 6.x на 3.10 уже не встанет. Переезд через uv занимает меньше времени, чем разбор последствий после первой дыры без патча.