Python End of Life & Support Options —
What To Do When Python Patches Stop, Every Version's Date
Python 3.8 reached end of life in October 2024. Python 3.9 followed in October 2025. Python 3.10 reached its EOL date on October 1, 2026 — with Python 3.11 following a year later in October 2027. At the other end of the line, Python 3.15, the newest release, shipped on October 9, 2026. 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.
Key Dates at a Glance
- Python 3.9: end of life 2025-10-31
- Python 3.10: end of life 2026-10-01
- Python 3.11: end of life 2027-10
- Python 3.12: end of life 2028-10
- Python 3.13: bugfix support ends 2026-10-01; end of life 2029-10
- Python 3.14: bugfix releases for about two years, until around the 3.16.0 release (PEP 745 sets no end date); end of life 2030-10
- Python 3.15 (newest): released 2026-10-09; bugfix releases for about two years, until around the 3.17.0 release (PEP 790 sets no end date); end of life 2031-10
- Python 3.8: end of life 2024-10-07
- Complete Python EOL schedule — all versions
- Every Python version, one line each
- Python 3.8 — end of life October 2024
- Python 3.9 — end of life October 2025
- Python 3.10 — end of life October 2026
- Python 3.11 — end of life October 2027
- Python 3.12 — supported until 2028
- Python 3.14 and 3.15 — the newest releases
- What the EOL Risk Score means
- How to migrate safely
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 from 3.6 on, plus 2.7, with the date its bugfix releases end and its official end-of-life date as published by the Python developer guide.
| Version | Released | Bugfix releases end | End of Life | Status | EOL Risk Score™ |
|---|---|---|---|---|---|
| Python 2.7 | Jul 3, 2010 | — | Jan 1, 2020 | EOL | 70 |
| Python 3.6 | Dec 23, 2016 | Dec 24, 2018 | Dec 23, 2021 | EOL | 70 |
| Python 3.7 | Jun 27, 2018 | Jun 27, 2020 | Jun 27, 2023 | EOL | 70 |
| Python 3.8 | Oct 14, 2019 | May 3, 2021 | Oct 7, 2024 | EOL | 70 |
| Python 3.9 | Oct 5, 2020 | May 17, 2022 | Oct 31, 2025 | EOL | 65 |
| Python 3.10 | Oct 4, 2021 | Apr 5, 2023 | Oct 1, 2026 | EOL | 55 |
| Python 3.11 | Oct 24, 2022 | Apr 2, 2024 | Oct 2027 | Approaching | 30 |
| Python 3.12 | Oct 2, 2023 | Apr 8, 2025 | Oct 2028 | Supported | 30 |
| Python 3.13 | Oct 7, 2024 | Oct 1, 2026 | Oct 2029 | Supported | 30 |
| Python 3.14 | Oct 7, 2025 | Around 3.16.0, no date set | Oct 2030 | Supported | 30 |
| Python 3.15 | Oct 9, 2026 | Around 3.17.0, no date set | Oct 2031 | Supported | 30 |
Every Python version, one line each
The same schedule as plain statements, one per minor version, for anyone who needs a single date rather than a table. Every date is bound to the same data as the Python product page, checked against the Python developer guide's version table, and re-verified at each build. Versions before Python 2.6 are not listed.
- Python 3.15 — released October 9, 2026; bugfix releases until around the 3.17.0 release (PEP 790 sets no end date); end of life October 2031.
- Python 3.14 — released October 7, 2025; bugfix releases end around the 3.16.0 release (no date set); end of life October 2030.
- Python 3.13 — released October 7, 2024; bugfix releases ended October 1, 2026; end of life October 2029.
- Python 3.12 — released October 2, 2023; bugfix releases ended April 8, 2025; end of life October 2028.
- Python 3.11 — released October 24, 2022; bugfix releases ended April 2, 2024; end of life October 2027.
- Python 3.10 — released October 4, 2021; bugfix releases ended April 5, 2023; end of life October 1, 2026.
- Python 3.9 — released October 5, 2020; bugfix releases ended May 17, 2022; end of life October 31, 2025.
- Python 3.8 — released October 14, 2019; bugfix releases ended May 3, 2021; end of life October 7, 2024.
- Python 3.7 — released June 27, 2018; bugfix releases ended June 27, 2020; end of life June 27, 2023.
- Python 3.6 — released December 23, 2016; bugfix releases ended December 24, 2018; end of life December 23, 2021.
- Python 3.5 — released September 13, 2015; end of life September 30, 2020.
- Python 3.4 — released March 16, 2014; end of life March 18, 2019.
- Python 3.3 — released September 29, 2012; end of life September 29, 2017.
- Python 3.2 — released February 20, 2011; end of life February 20, 2016.
- Python 3.1 — released June 27, 2009; end of life April 9, 2012.
- Python 3.0 — released December 3, 2008; end of life June 27, 2009.
- Python 2.7 — released July 3, 2010; end of life January 1, 2020.
- Python 2.6 — released October 1, 2008; end of life October 29, 2013.
Python 3.8 — End of Life October 7, 2024
Python 3.8 reached its official end-of-life date on October 7, 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.
Migrating from Python 3.8
- Target Python 3.12 or later — 3.12 is supported until 2028, and the current stable release is 3.15
- Run
python -m py_compileon your codebase against 3.12 to catch syntax issues early - Check
distutilsusage — it was deprecated in 3.10 and removed in 3.12 - Replace
asyncio.get_event_loop()withasyncio.get_running_loop() - Use
pyupgrade --py312-plusto automatically modernize syntax
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.
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 1, 2026
Python 3.10 reached end of life on October 1, 2026. 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.
Python 3.11 — End of Life October 2027
Python 3.11 reaches end of life on October 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.
That date 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.
Start your Python 3.11 migration now
- Run
pip install -r requirements.txtagainst Python 3.12 in a fresh venv — most failures surface immediately - Check
setuptoolsandpkg_resourcesusage — both are deprecated in newer pip tomllibis now in stdlib — remove thetomlibackport dependency- Exception groups (
ExceptionGroup) are available in 3.11+ and 3.12 — no migration needed - Run your full test suite on 3.12 in CI before touching production
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 2028 — giving you a runway of just over two years from today. The current stable release is Python 3.15.
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.
Python 3.14 and 3.15 — The Newest Releases
Python 3.15, released October 2026, is the current stable release. Python.org dates the 3.15.0 release October 9, 2026. Its release schedule plans bugfix releases roughly every second month for two years, then source-only security releases until approximately October 2031 (PEP 790). The headline changes in the 3.15 release notes include explicit lazy imports for faster startup (PEP 810), UTF-8 as the default encoding (PEP 686), new frozendict and sentinel built-in types (PEP 814 and PEP 661), unpacking in comprehensions (PEP 798), a dedicated profiling package with the Tachyon sampling profiler (PEP 799), and a significantly upgraded experimental JIT compiler.
Python 3.14, released October 7, 2025, is now the previous release. It stays in its bugfix phase, with new binary releases roughly every two months, until around the 3.16.0 release (PEP 745 sets no end date), then receives source-only security fixes until its end of life on October 2030. Python 3.14 made the free-threaded build officially supported (PEP 779).
Python 3.13, available since October 2024, left its bugfix phase on October 1, 2026: it now receives security fixes only, as source releases with no new binary installers, until its end of life on October 2029. It introduced an experimental free-threaded mode (PEP 703 — removing the GIL), a new interactive interpreter (REPL), and continued performance work from the Faster CPython project.
For most production deployments, Python 3.12, 3.13 or 3.14 are safe choices today. The free-threaded build was experimental in 3.13 and is officially supported but optional from 3.14; confirm that your C extensions ship free-threaded wheels before you turn it on. Adopt 3.15 when your key dependencies have confirmed compatibility, and test code that opens files without naming an encoding: with UTF-8 now the default (PEP 686), that code can read and write text differently on hosts whose locale encoding is not UTF-8, which includes many Windows machines.
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:
- EOL Recency (40pts) — zero while end of life is more than six months away, rising as the date nears and passes, and reaching the full 40 points two years after it. Python 2.7, more than six years past EOL, has an overall score of 70; Python 3.11, still supported, has 30.
- Attack Surface (30pts) — Python runs web servers, processes data, executes arbitrary code. CVEs in EOL versions are never patched.
- CISA KEV Exposure (20pts) — whether known exploited vulnerabilities exist for this version in the CISA catalog.
- Extended Support Availability (10pts) — commercial extended support options for Python are limited, which increases urgency.
Python currently carries an EOL Risk Score™ of 55/100 — Grade C, high 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.
Frequently Asked Questions
When did Python 3.10 reach end of life?
October 1, 2026. Python 3.10 was released October 4, 2021; bugfix releases ended April 5, 2023 and it has received source-only security fixes since. Since October 1, 2026 the Python core team has shipped no further fixes for 3.10, including security fixes.
Is Python 3.9 still supported?
No. Python 3.9 reached end of life on October 31, 2025 (final release 3.9.25); Python 3.8 ended October 7, 2024. Neither receives security fixes. Third-party vendors sell extended security patches for 3.8 and 3.9 for teams that cannot upgrade yet.
How long is each Python version supported?
Five years from release under PEP 602's annual cadence: roughly two years of bugfix releases, then security-only fixes until end of life in October of the fifth year. Python 3.11 ends October 2027; 3.12 October 2028; 3.13 October 2029; 3.14 October 2030; 3.15 until approximately October 2031 (PEP 790).
Which Python version should I upgrade to in 2026?
Python 3.12 or 3.13 for the best balance of library support and runway (to October 2028 and October 2029). Python 3.14, released October 7, 2025, has a runway to October 2030. Python 3.15, released October 9, 2026, is the newest release, with a year more runway, and is the right target for new projects once your dependencies publish wheels for it. Skip 3.11 for new deployments — it leaves in October 2027.
Is Python 2.7 still supported anywhere?
Not by the Python core team — 2.7 ended January 1, 2020 (final release 2.7.18 in April 2020). Some Linux distributions and third-party vendors ship extended security fixes for 2.7 packages, but any application still on 2.7 is running a runtime that has been unpatched upstream for over six years.
How do I check my Python version?
Run python3 --version (or python --version) on the host, or sys.version_info inside the interpreter. Check what your project pins in pyproject.toml (requires-python), .python-version, runtime.txt, tox/CI matrices and your Dockerfile's FROM python:… tag — the pinned version is often older than the host's.
What happens if I keep running Python 3.10 after October 1, 2026?
The interpreter keeps running, but every vulnerability fixed in 3.11+ stays open on 3.10 — including issues in bundled components such as the ssl, zipfile and http modules — and major libraries drop 3.10 wheels quickly, so your dependency upgrades become blocked too. Compliance frameworks treat an unsupported runtime as a control failure. Extended support from third-party vendors is a bridge; the upgrade is the destination.
When do Python 3.11 and 3.12 reach end of life?
Python 3.11 reaches end of life in October 2027 and Python 3.12 in October 2028. Both are already in the security-only phase: 3.11's bugfix releases ended April 2, 2024 and 3.12's ended April 8, 2025, so each receives source-only security fixes until its end-of-life date and nothing after it.
Is Python 3.8 still supported?
No. Python 3.8 reached end of life on October 7, 2024 and Python 3.7 on June 27, 2023. Neither receives security fixes from the Python core team. Python 3.10 followed on October 1, 2026. The supported versions are 3.11, 3.12, 3.13, 3.14 and 3.15.
When did Python 3.13 stop getting bugfix releases?
Python 3.13's bugfix releases ended on October 1, 2026; from then until its end of life in October 2029 it receives security fixes only, as source releases. Python 3.14's bugfix releases continue for about two years, until around the 3.16.0 release (PEP 745 sets no end date), and its end of life is October 2030.
Is there extended support for Python 3.8, 3.9 or 3.10 after end of life?
Not from the Python core team, whose support ends on the end-of-life date. Commercial vendors sell security patches for end-of-life Python versions, usually priced per year, as a bridge for applications that cannot move to a supported version in time; Linux distributions also backport fixes into their own Python packages on their own clocks, which covers the interpreter they ship and nothing else. Whether a bridge beats an upgrade depends on how long the application has left to run; the form on this page matches options.