Updated August 2, 2026: dates verified against vendor lifecycle data.
Python 3.8 reached end of life in October 2024. Python 3.9 followed in October 2025. Python 3.10 hits EOL on October 31, 2026 - under three months away. Python 3.11 follows a year later on October 31, 2027.
And Python 2.7 has been dead since January 2020. It still runs in more production environments than anyone admits.
This is the single reference for Python end-of-life dates across every major version - with EOL Risk Scores, migration notes, and plain-English guidance on what to do if you're running past end of support.
Python 3.10 EOL is October 31, 2026 - under three months away. If your stack runs Python 3.10, start migration planning today. Migrations take longer than expected when dependencies are involved.
Complete Python EOL Schedule
Python releases a new minor version (3.x) roughly every October and supports each version for five years.
| Version | Released | End of Life | Status | EOL Risk Score |
|---|---|---|---|---|
| Python 2.7 | Jul 2010 | Jan 1, 2020 | 🔴 EOL | 98 Critical |
| Python 3.6 | Dec 2016 | Dec 23, 2021 | 🔴 EOL | 95 Critical |
| Python 3.7 | Jun 2018 | Jun 27, 2023 | 🔴 EOL | 92 Critical |
| Python 3.8 | Oct 2019 | Oct 7, 2024 | 🔴 EOL | 88 Critical |
| Python 3.9 | Oct 2020 | Oct 31, 2025 | 🔴 EOL | 82 Critical |
| Python 3.10 | Oct 2021 | Oct 31, 2026 | ⚠️ EOL Oct 31, 2026 | 48 Medium |
| Python 3.11 | Oct 2022 | Oct 31, 2027 | Security fixes only | 44 Medium |
| Python 3.12 | Oct 2023 | Oct 31, 2028 | Security fixes only | 22 Low |
| Python 3.13 | Oct 2024 | Oct 31, 2029 | ✅ Stable | 15 Low |
| Python 3.14 | Oct 2025 | Oct 31, 2030 | ✅ Latest | — |
⚠️ Python 3.10 reaches EOL on October 31, 2026; Python 3.11 follows on October 31, 2027. Back-to-back October deadlines mean migration work should be scheduled now, not after the first one hits.
Python 3.8 - End of Life October 7, 2024
Python 3.8 reached end of life on October 7, 2024. No security patches, no bug fixes, no CVE remediation.
Python 3.8 became the default Python on Ubuntu 20.04 LTS - which means any server still running Ubuntu 20.04 is almost certainly running Python 3.8 as its system Python.
The double EOL problem: Ubuntu 20.04 reached EOL in April 2025. Its system Python is 3.8, also EOL. Two compounding unpatched runtimes on the same server.
Migration path to Python 3.12:
- Run
python -m py_compileon your codebase against 3.12 to catch syntax issues early - Check
distutilsusage - removed in Python 3.12 - Replace
asyncio.get_event_loop()withasyncio.get_running_loop() - Use
pyupgrade --py312-plusto automatically modernize syntax
→ Python 3.8 EOL Risk Score Card
Python 3.9 - End of Life October 31, 2025
Python 3.9 reached end of life on October 31, 2025. It introduced built-in generic types (list[int] instead of List[int]), the | merge operator for dicts, and became the default Python on Ubuntu 22.04 LTS.
The Docker problem: Many Docker base images still use python:3.9 as their foundation. If you're pulling from Docker Hub without pinning to a specific digest, you may be running 3.9 in containers without realising it.
Check your containers:
docker inspect <image> | grep -i python
If you see 3.9 or earlier, update your Dockerfiles to FROM python:3.12-slim and rebuild.
→ Python 3.9 EOL Risk Score Card
Python 3.11 - End of Life October 31, 2027
Python 3.11 reaches end of life on October 31, 2027.
It was the fastest Python release in years - benchmarks showed 10-60% performance improvements over Python 3.10. Many teams upgraded specifically for these gains and then stayed there.
That runway sounds comfortable. It isn't - especially for larger codebases with complex dependency trees. The average Python migration takes 4-8 weeks when you factor in dependency compatibility testing, CI pipeline updates, and staged rollouts.
Start now. Key steps:
- Create a test venv:
python3.12 -m venv venv-testand install your fullrequirements.txt - Check
setuptoolsandpkg_resourcesusage - both are deprecated in newer pip -
tomllibis now in stdlib - remove thetomlibackport dependency - Run your full test suite on 3.12 in CI before touching production
→ Python 3.11 EOL Risk Score Card
Python 3.12 - Security Support Until October 2028
Python 3.12 is a solid migration target. Bugfix support ended April 2, 2025; security fixes continue until October 31, 2028.
Key changes to be aware of:
-
distutilsremoved - most commonly triggered by oldsetup.py-based packages - Removed modules:
aifc,cgi,cgitb,chunk,crypt,imghdr,mailcap,pipes,sndhdr,telnetlib,uu -
@overridedecorator for type checking - Further performance improvements from the Faster CPython project
Check for removed module usage:
grep -r "import distutils\|from distutils" .
→ Python 3.12 EOL Risk Score Card
Python 3.13 - Stable Release
Python 3.13 has been available since October 2024; its security-fix phase begins October 2026, with EOL on October 31, 2029. It introduces an experimental free-threaded mode (PEP 703 - removing the GIL) and a new interactive REPL.
For most production deployments, Python 3.12 is the right choice today. The free-threaded mode is experimental. Adopt 3.13 when your key dependencies have confirmed compatibility.
Python 3.14 - released October 7, 2025 - is now the latest release (currently 3.14.6), with full support until October 2027 and EOL on October 31, 2030.
How to Migrate Safely - 5 Steps
Step 1 - Test the target version first
python3.12 -m venv venv-test then pip install -r requirements.txt. Every failure is a migration task.
Step 2 - Check for removed modules
Run grep -r "import distutils\|from distutils" . across your codebase. distutils removal is the most common blocker.
Step 3 - Use pyupgrade
pip install pyupgrade
pyupgrade --py312-plus **/*.py
Automatically updates type hints, string formatting, and deprecated patterns.
Step 4 - Update CI before production
Change your CI matrix to include Python 3.12. Clean CI run before any production change.
Step 5 - Update Docker base images
FROM python:3.11 becomes FROM python:3.12-slim. Rebuild and test.
EOL Risk Scores - What They Mean
Every Python version page on endoflife.ai carries an EOL Risk Score - a 0-100 score measuring actual security and operational risk. Four factors:
- EOL Recency (40pts) - how long since support ended
- Attack Surface (30pts) - Python runs web servers, data pipelines, scripts. CVEs in EOL versions are never patched.
- CISA KEV Exposure (20pts) - known exploited vulnerabilities in the CISA catalog
- Extended Support Availability (10pts) - commercial options to reduce urgency
| Version | Score | Band |
|---|---|---|
| Python 2.7 | 98 | 🔴 Critical |
| Python 3.8 | 88 | 🔴 Critical |
| Python 3.9 | 82 | 🔴 Critical |
| Python 3.10 | 48 | 🟡 Medium |
| Python 3.11 | 44 | 🟡 Medium |
| Python 3.12 | 22 | 🟢 Low |
| Python 3.13 | 15 | 🟢 Low |
Check Your Full Stack
Python runtime EOL is one piece of the puzzle. Your pip packages, frameworks (Django, Flask, FastAPI), and OS runtime each have their own end-of-life dates.
Use the free EOL Checker or Stack Scanner at endoflife.ai to audit your entire dependency tree - no account required.
This article is part of The EOL Intelligence Report series on DEV.to. EOL dates sourced from endoflife.date, Python Software Foundation, and CISA KEV Catalog.
Top comments (0)