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

VersionFirst releaseStatus in the Developer’s GuideEnd of life
3.104 October 2021End of life1 October 2026
3.1124 October 2022Security fixes onlyOctober 2027
3.122 October 2023Security fixes onlyOctober 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

  1. Your machine and servers: python --version in each environment, including virtual environments.
  2. Your projects: search for requires-python in pyproject.toml, python_requires in setup.py, and python-version in CI files such as GitHub Actions.
  3. Containers: search Dockerfiles for FROM python:3.10.
  4. Deployment platforms: check which runtime version your host or serverless platform is set to.

Which version to move to

TargetSupported untilNotes
3.11October 2027Smallest jump, but you would be upgrading again within a year
3.12October 2028Security fixes only already
3.13October 2029A good target with a long window
3.14October 2030The newest well-established release
3.15October 2031Released 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 binhex module, the @asyncio.coroutine() decorator (use async def), inspect.getargspec() and formatargspec() (use inspect.signature()), and the lgettext family in gettext.
  • The 'U' file mode is no longer accepted by open(). Use "r"; universal newlines are already the default in text mode.
  • random.sample() requires a sequence. Passing a set no longer works; use list(s) or sorted(s). random.shuffle() lost its random parameter.
  • 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.
  • unittest no 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:

  • distutils is gone (PEP 632). setuptools still provides it, so build code that imports it usually keeps working once setuptools is installed.
  • imp is gone. Use importlib, for example importlib.util.find_spec() in place of imp.find_module(), and importlib.reload() in place of imp.reload().
  • asyncore, asynchat and smtpd are gone. Use asyncio, or aiosmtpd for SMTP servers.
  • setuptools is no longer installed in new virtual environments. pkg_resources, setuptools and distutils are not there by default, so projects that need them at runtime must declare and install setuptools.
  • Long-deprecated unittest aliases are removed, such as assertEquals (use assertEqual) and failUnless (use assertTrue).
  • ssl.wrap_socket() and ssl.match_hostname() are removed. Create an SSLContext and call its wrap_socket().
  • f-string tokenizing changed (PEP 701). Tools that use tokenize see FSTRING_START, FSTRING_MIDDLE and FSTRING_END tokens instead of one STRING token.

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

  1. 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.
  2. Search for removed imports first: distutils, imp, asyncore, binhex.
  3. 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.
  4. 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.
  5. 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.