Python Lifecycle Intelligence

Python End-of-Life Dates —
Official EOL Schedule for Every Version

By Scott Bissett Updated August 9, 2026 · endoflife.ai · 8 min read

Python 3.8 reached end of life in October 2024. Python 3.9 followed in October 2025. Python 3.10 is approaching its EOL date in October 2026 — under three months from now — with Python 3.11 following a year later in October 2027. And Python 2.7 has been dead since January 2020, yet it still runs in more production environments than anyone admits.

This is the single authoritative reference for Python end-of-life dates across every major version — with EOL Risk Score™s™, migration notes, and plain-English guidance on what to do if you're running past end of support.

⚠ Upcoming EOL — Act Now
Python 3.10 reaches end of life on October 31, 2026 — under three months away. If your stack runs Python 3.10, start your migration planning today. Migrations take longer than expected when dependencies are involved. Python 3.11 follows on October 31, 2027.

Complete Python EOL Schedule

Python releases a new minor version (3.x) roughly every October and supports each version for five years. The table below covers every Python 3.x version and its official end-of-life date as published by the Python Software Foundation.

Version Released End of Life Status EOL Risk Score™
Python 2.7 Jul 2010 Jan 1, 2020 EOL 70
Python 3.6 Dec 2016 Dec 23, 2021 EOL 70
Python 3.7 Jun 2018 Jun 27, 2023 EOL 70
Python 3.8 Oct 2019 Oct 7, 2024 EOL 65
Python 3.9 Oct 2020 Oct 31, 2025 EOL 60
Python 3.10 Oct 2021 Oct 31, 2026 EOL in 3 months 45
Python 3.11 Oct 2022 Oct 31, 2027 Supported 30
Python 3.12 Oct 2023 Oct 31, 2028 Stable 30
Python 3.13 Oct 2024 Oct 31, 2029 Supported 30
⚠ Next EOL — October 2026
Python 3.10 reaches end of life on October 31, 2026 — under three months away. Python 3.11 follows one year later, on October 31, 2027. If your stack runs Python 3.10, you have roughly three months to migrate. The current stable release is Python 3.14 (released October 2025, supported until October 31, 2030).
Running Python past end of life?
Extended support for Python exists — vetted vendors ship security patches for years past the official EOL date. Tell us where to reach you and we’ll reply with matched options and pricing guidance — free, no obligation.

Free · No obligation · Independent — we track the dates, vendors don’t pay for placement · dates verified against vendor sources. See all support options →

Python 3.8 — End of Life October 31, 2024

Python 3.8 reached its official end-of-life date on October 31, 2024. It has been unsupported for well over a year. No security patches, no bug fixes, no CVE remediation.

Python 3.8 was the version that introduced the walrus operator (:=), positional-only parameters, and significant performance improvements to the dict implementation. It became the default Python on Ubuntu 20.04 LTS — which means any server still running Ubuntu 20.04 is very likely running Python 3.8 as its system Python.

Ubuntu 20.04 + Python 3.8 — double risk
Ubuntu 20.04 reached EOL in April 2025. Its system Python is 3.8, also EOL. If you're running Ubuntu 20.04, you likely have two compounding EOL risks on the same server. Check the Ubuntu 20.04 EOL Risk Score and Python 3.8 EOL Risk Score.
EOL Risk Score™
Python 3.8 — Score: 88 Critical

Migrating from Python 3.8

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] from typing), the | merge operator for dicts, and became the default Python on Ubuntu 22.04 LTS.

Python 3.9 had a long tail of adoption because Ubuntu 22.04 shipped it as the default. 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.

EOL Risk Score™
Python 3.9 — Score: 82 Critical

Check your Docker base images

Run docker inspect <image> | grep -i python on your production containers. If you see 3.9 or earlier, that's your migration target. Update your Dockerfiles to FROM python:3.12-slim and rebuild.

Python 3.10 — End of Life October 31, 2026

Python 3.10 reaches end of life on October 31, 2026 — under three months from now. It introduced structural pattern matching (match/case), better error messages, and parenthesized context managers.

If you adopted Python 3.10 specifically for pattern matching, the good news is that Python 3.12 fully supports it with further improvements. The migration path from 3.10 to 3.12 is straightforward for most codebases.

EOL Risk Score™
Python 3.10 — Score: 48 Medium · EOL Oct 31, 2026

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, driven by the Specializing Adaptive Interpreter. Many teams upgraded specifically for these gains.

The EOL date is about fifteen months away. That sounds comfortable. It isn't — especially for larger codebases with complex dependency trees. The average Python migration across a medium-sized application takes 4–8 weeks when you factor in dependency compatibility testing, CI pipeline updates, and staged rollouts.

EOL Risk Score™
Python 3.11 — Score: 44 Medium · EOL Oct 31, 2027

Start your Python 3.11 migration now

Python 3.12 — Supported Until October 2028

Python 3.12 is a widely deployed, conservative migration target for teams on 3.8, 3.9, 3.10, or 3.11. It is supported until October 31, 2028 — giving you a runway of just over two years from today. The current stable release is Python 3.14.

Python 3.12 brings further performance improvements, a new @override decorator for type checking, improved f-string parsing, and the removal of long-deprecated modules including distutils, aifc, cgi, and chunk. The removal of distutils is the most common migration blocker — check for it before upgrading.

EOL Risk Score™
Python 3.12 — Score: 22 Low · Supported until Oct 2028

Python 3.13 and 3.14 — The Newest Releases

Python 3.13, available since October 2024, is supported until October 31, 2029. It introduces an experimental free-threaded mode (PEP 703 — removing the GIL), a new interactive interpreter (REPL), and continued performance work from the Faster CPython project. Python 3.14, released October 2025, is the current stable release and is supported until October 31, 2030.

For most production deployments, Python 3.12 or 3.13 are safe choices today. The free-threaded mode in 3.13+ is experimental and not recommended for production. Adopt 3.13 or 3.14 when your key dependencies have confirmed compatibility.

What the EOL Risk Score™ Means for Python

Every Python version page on endoflife.ai carries an EOL Risk Score™ — a 0–100 score measuring the actual security and operational risk of running that version in production. Four factors drive the score:

Score reference
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
What to do about it

Python currently carries an EOL Risk Score™ of 60/100 — Grade C, elevated risk, recalculated at every site build from EOL recency, attack surface, CISA KEV exposure, and extended-support availability. Per-version scores and dates are on the Python lifecycle page.

The right response comes down to one question: how many more years does this system need to run? Under a year, extended support (where it exists) is usually cheaper than an emergency migration. One to three years, migrate — support fees paid repeatedly cost more than doing the project once. Indefinitely, migrate now and plan the next one before it surprises you. Extended support is often the more expensive choice over a multi-year horizon — a bridge, not a destination. And if this deadline feels like vendor caprice, it isn’t — why end of life is inevitable for every version, with the receipts.

How to Migrate Safely

Step 1 — Test against the target version first

Create a fresh virtual environment with Python 3.12: python3.12 -m venv venv-test. Install your full requirements.txt. Note every failure — these are your migration tasks.

Step 2 — Check for removed modules

Python 3.12 removed distutils, aifc, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu, and xdrlib. Run grep -r "import distutils\|from distutils" . to find usage in your codebase.

Step 3 — Use pyupgrade for automatic fixes

pip install pyupgrade then run pyupgrade --py312-plus **/*.py. It automatically updates old-style type hints, string formatting, and deprecated patterns. Safe to run on any codebase.

Step 4 — Update CI before production

Change your CI matrix to include Python 3.12. Run your full test suite. Fix failures. Only promote to production after a clean CI run. Use .python-version or pyproject.toml to pin the version explicitly.

Step 5 — Update your Docker base images

Change FROM python:3.11 to FROM python:3.12-slim in all Dockerfiles. Rebuild and test. The -slim variant reduces image size significantly and is appropriate for most production workloads.

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.

The Monthly EOL Digest™

Once a month — critical end-of-life dates, CVE blind spots, and lifecycle changes worth knowing about.

✓ You're on the list.