Python 3.10 End of Life: What to Do Now
Python 3.10 reached end of life on 1 October 2026, and 3.11 follows in October 2027. What it means, which version to move to, and what breaks on the way.
Python 3.10 reached end of life on 1 October 2026. It no longer gets fixes of any kind, and Python 3.11 is next, scheduled for October 2027. If you run either, plan the move now rather than when something forces it.
For the dates of every version, see the Python end-of-life dates page. For the next version along, see Python 3.12 end of life.
The dates
| Version | First release | Status in the Developer’s Guide | End of life |
|---|---|---|---|
| 3.10 | 4 October 2021 | End of life | 1 October 2026 |
| 3.11 | 24 October 2022 | Security fixes only | October 2027 |
| 3.12 | 2 October 2023 | Security fixes only | October 2028 |
The Developer’s Guide explains the pattern: support lasts five years from release, and for versions before 3.13 security-only support begins 18 months after release, with no more binaries released. Dates marked as scheduled can be adjusted. The latest releases at the time of writing are 3.10.22 (1 October 2026) and 3.11.18 (25 October 2026), according to endoflife.date.
What end of life means
Nothing stops working on the day. Your code, your virtual environments and your containers keep running. What changes:
- No more security fixes for the interpreter. A vulnerability found in Python 3.10 itself will be fixed in newer versions and not in 3.10.
- Libraries drop support. Packages move their minimum Python forward. Pillow 13, for example, dropped Python 3.10; see the Pillow security guide.
- Tooling follows. CI images, base images and hosting platforms eventually stop offering the version.
Find out where you are still on 3.10
- Your machine and servers:
python --versionin each environment, including virtual environments. - Your projects: search for
requires-pythoninpyproject.toml,python_requiresinsetup.py, andpython-versionin CI files such as GitHub Actions. - Containers: search Dockerfiles for
FROM python:3.10. - Deployment platforms: check which runtime version your host or serverless platform is set to.
Which version to move to
| Target | Supported until | Notes |
|---|---|---|
| 3.11 | October 2027 | Smallest jump, but you would be upgrading again within a year |
| 3.12 | October 2028 | Security fixes only already |
| 3.13 | October 2029 | A good target with a long window |
| 3.14 | October 2030 | The newest well-established release |
| 3.15 | October 2031 | Released 9 October 2026; wait for your dependencies |
For most projects, go straight to 3.13 or 3.14. Both 3.11 and 3.12 are already in security-only mode, so upgrading to them only postpones the next migration. If you want to go further, see what’s new in Python 3.15 and porting to Python 3.15.
What breaks going from 3.10 to 3.11
From the Python 3.11 release notes:
- Removed: the
binhexmodule, the@asyncio.coroutine()decorator (useasync def),inspect.getargspec()andformatargspec()(useinspect.signature()), and thelgettextfamily ingettext. - The
'U'file mode is no longer accepted byopen(). Use"r"; universal newlines are already the default in text mode. random.sample()requires a sequence. Passing asetno longer works; uselist(s)orsorted(s).random.shuffle()lost itsrandomparameter.- Regular expressions: global inline flags such as
(?i)are only allowed at the start of a pattern.re.compile(r"abc(?i)")is now an error. unittestno longer discovers namespace packages.
What breaks going from 3.11 to 3.12
From the Python 3.12 release notes, the changes most likely to stop an upgrade:
distutilsis gone (PEP 632).setuptoolsstill provides it, so build code that imports it usually keeps working oncesetuptoolsis installed.impis gone. Useimportlib, for exampleimportlib.util.find_spec()in place ofimp.find_module(), andimportlib.reload()in place ofimp.reload().asyncore,asynchatandsmtpdare gone. Useasyncio, oraiosmtpdfor SMTP servers.setuptoolsis no longer installed in new virtual environments.pkg_resources,setuptoolsanddistutilsare not there by default, so projects that need them at runtime must declare and installsetuptools.- Long-deprecated
unittestaliases are removed, such asassertEquals(useassertEqual) andfailUnless(useassertTrue). ssl.wrap_socket()andssl.match_hostname()are removed. Create anSSLContextand call itswrap_socket().- f-string tokenizing changed (PEP 701). Tools that use
tokenizeseeFSTRING_START,FSTRING_MIDDLEandFSTRING_ENDtokens instead of oneSTRINGtoken.
The changes from 3.12 to 3.13 and 3.13 to 3.14 are listed in the 3.12 end-of-life guide.
A safe way to upgrade
- Run your tests on the new version with warnings as errors:
python -W error -m pytest. A deprecation warning on 3.10 is often a removal two versions later. - Search for removed imports first:
distutils,imp,asyncore,binhex. - Check your dependencies publish wheels for the target version. Packages with compiled extensions are the usual blockers; the dependency security guide covers auditing what you ship.
- Install the new interpreter with a tool, not by hand. uv can install a Python version and create the environment, and the virtual environments guide explains how environments fit together.
- Rebuild containers and CI images pinned to 3.10; the Docker guide shows a Dockerfile that keeps rebuilds fast.
Frequently Asked Questions
When did Python 3.10 reach end of life?
1 October 2026. Python 3.10 was first released on 4 October 2021, and the Python Developer’s Guide lists it as end-of-life. After that date the core team stops releasing fixes of any kind for it.
Is Python 3.10 still safe to use?
It no longer receives security fixes, so any vulnerability found in 3.10 itself will not be patched in 3.10. Existing programs keep running, but you should plan to move, and libraries are dropping 3.10 support as well.
When does Python 3.11 reach end of life?
October 2027 (scheduled, with the exact date 31 October 2027 according to endoflife.date). It already gets security fixes only, and the Developer’s Guide notes that dates in its table can be adjusted.
Which Python version should I upgrade to from 3.10?
Python 3.13 or 3.14 for most projects. 3.11 and 3.12 are both in their security-only phase and end in 2027 and 2028, so moving straight past them saves a second upgrade. Python 3.15, released in October 2026, is supported longest but give your dependencies time to catch up.
What breaks when upgrading from Python 3.10 to 3.11?
Removals include the binhex module, the @asyncio.coroutine decorator, inspect.getargspec(), and the ‘U’ file mode, which now raises ValueError. random.sample() no longer accepts a set, and global inline regex flags such as (?i) must be at the start of a pattern.
What breaks when upgrading from Python 3.11 to 3.12?
distutils, imp, asyncore, asynchat and smtpd were removed, along with long-deprecated unittest aliases such as assertEquals and failUnless. Virtual environments no longer include setuptools by default, so projects that import it at runtime must declare it.