The go-to resource for upgrading Python, Django, Flask, and your dependencies.

Python 3.12 EOL Timeline: Planning Your Upgrade to Python 3.13 Before Support Ends


Python 3.12 active support ended April 2, 2025—now security-only until Oct 31, 2028 (per endoflife.date/python, PEP 693). No bugfixes; upgrade to 3.13 (active until Oct 2026, security to 2029) for performance, free-threaded builds, better REPL. Searches: “Python 3.12 EOL”, “upgrade Python 3.12 to 3.13”, “Python version timeline 2026”.

Why Python Version Support Matters

Before we get into timelines and upgrade procedures, though, let’s consider why Python version support cycles matter for long-term software maintenance. Like any major software project, Python follows a predictable support lifecycle: active support with bugfixes, followed by security-only maintenance, and finally end-of-life. Understanding these phases helps us plan upgrades proactively rather than reactively responding to security vulnerabilities or dependency conflicts.

Consider this analogy: in 1856, corrugated cardboard was invented as a packaging material. Initially, its use was modest—mostly for protecting fragile items during shipping. Today, however, corrugated cardboard is quite common; it’s the foundation of modern logistics, from Amazon boxes to international shipping containers. The material isn’t perfect for every use case, but it’s an effective solution for a narrow set of problems: protection, standardization, and cost-effectiveness.

Python version management follows a similar pattern: version managers like mise or asdf provide standardized, cost-effective solutions for managing Python environments. They aren’t perfect for every scenario, but they solve a narrow set of problems exceptionally well: reproducible environments, isolated dependencies, and clean upgrade paths. Understanding when—and how—to upgrade Python versions is part of maintaining that ecosystem.

Understanding Python Version Support Cycles

Python versions follow a predictable lifecycle that mirrors many open-source projects. Each version receives active support with bugfixes for approximately 18 months, followed by security-only maintenance for several years. This pattern isn’t arbitrary—it’s designed to balance innovation with stability.

Before we examine specific timelines, though, let’s consider what happens when support ends:

When active support ends, Python 3.12 will receive no new bugfixes. This means that if you discover a bug in Python’s standard library or core language features, it won’t be fixed. Security patches continue, but only for critical vulnerabilities. After October 2028, even security patches stop entirely.

This creates a practical problem: dependency authors stop testing against EOL versions, CI/CD pipelines may fail, and security scanning tools flag outdated interpreters. The upgrade path from 3.12 to 3.13 is relatively straightforward, but the longer you wait, the more technical debt accumulates.

Python 3.12 EOL Timeline

Python 3.12 was released on October 2, 2023. Its support timeline is documented in PEP 693:

PhaseDateDetails
ReleaseOct 2, 20233.12.0
Active Support EndApr 2, 2025No bugfixes
Security EndOct 31, 2028Source-only
Latest: 3.12.13Mar 3, 2026Security fixes

Source: endoflife.date/python, PEP 693.

Python 3.13 Timeline

Python 3.13, released October 7, 2024, introduces free-threaded builds (no GIL) and several performance improvements. Its support timeline is documented in PEP 719:

PhaseDateDetails
ReleaseOct 7, 20243.13.0
Active Support EndOct 1, 2026Bugfixes end
Security EndOct 31, 2029Final
Latest: 3.13.12Feb 3, 2026PEP 719

Why Upgrade to 3.13 Before 3.12 Security Risks Mount

You might wonder why we can’t postpone the upgrade until closer to the security-only phase. Several practical considerations argue against delay:

  • Free-threaded builds (python3.13t): No GIL, multiprocessing speedups.
  • Improved errors/debugging: Better tracebacks, REPL.
  • Performance: Faster dicts, comprehensions.
  • Security: Fresh fixes, audit-ready.
  • Dependency ecosystem: Libraries drop EOL version support gradually.

Of course, upgrading involves more than adopting new features—we also maintain a secure, supported environment. When 3.12 reaches security-only mode, you rely on the Python Security Response Team to decide which vulnerabilities warrant backporting. With 3.13, you receive the full benefit of active development and bugfixes.

Choosing a Version Manager: Options Comparison

Before we dive into upgrade procedures, let’s discuss version management tools. Several approaches exist for managing Python versions on a single system. Here’s a comparison:

ToolProsConsBest for
miseFast, multi-language, asdf-compatibleNewer, smaller ecosystemMulti-language projects
asdfMature, plugin ecosystem, communitySlightly slowerEstablished workflows
uvExtremely fast deps/resolution, Python-focusedLimited non-Python supportDependency-heavy Python apps
pyenvReliable, simple Python-onlySlower builds, Python-onlyPure Python projects

Personal preference: We recommend mise for its speed and multi-language support. asdf offers broader adoption as a solid alternative. We’ll detail both below.

Why Use a Version Manager?

Version managers solve several problems:

  • Multiple projects: Different projects may require different Python versions
  • Testing: Test your code against multiple Python versions
  • Isolation: Keep system Python clean for OS operations
  • Reproducibility: Lock specific versions in configuration files

Upgrade Procedure with mise

mise is a modern version manager that’s compatible with asdf plugins and significantly faster. Let’s walk through the upgrade process step by step.

Step 1: Install mise (if not already installed)

First, we need to install mise. The recommended approach is using the official installer:

$ curl https://mise.run | sh

$ echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

$ echo 'eval "$(mise activate bash)"' >> ~/.bashrc

$ exec $SHELL

Note: The installer automatically detects your shell and provides appropriate instructions.

Step 2: Install Python 3.13

Once mise is installed, we can install Python 3.13:

$ mise use --global python@3.13

Of course, you can specify a specific patch version if needed:

$ mise use --global python@3.13.12

Step 3: Configure Per-Project Version

For individual projects, create a .tool-versions file:

$ echo "python 3.13.0" > .tool-versions
$ mise install

Of course, you can also use mise.toml for more complex configuration:

[tools]
python = "3.13.0"

Step 4: Upgrade Dependencies

With Python 3.13 installed, we need to upgrade our dependencies. uv provides fast dependency resolution:

$ uv pip compile pyproject.toml --hashes -o requirements.txt

$ uv pip sync requirements.txt

Note: If you’re using pip-tools or poetry, the process is similar but commands differ. See Post 20 for a detailed comparison.

Step 5: Audit and Test

Before deploying, audit dependencies and run your test suite:

$ pip-audit -r requirements.txt

$ pytest

Alternative: Using asdf

If you prefer asdf (or already use it), the process is similar:

$ asdf plugin add python

$ asdf install python 3.13.0

$ asdf local python 3.13.0

Though mise is generally faster, asdf has broader plugin support for other languages.

Verification

After upgrading, verify your installation:

$ python --version

You can also check which Python executable is being used:

$ which python

Alternative Approach: Direct Installation

Note: While version managers are recommended for development, you might install Python 3.13 directly in production environments. This approach is common in Docker containers or when using system package managers. However, for local development, version managers provide better isolation and flexibility.

Compatibility Checklist

Before deploying your upgraded code, verify compatibility:

  • Deps: Run uv pip check or pip check to validate dependency compatibility
  • C extensions: Recompile if needed (some packages require reinstallation)
  • Tests: Run your full test suite with pytest or your preferred test runner
  • Docker: Update your Dockerfile to use FROM python:3.13-slim
  • CI/CD: Update GitHub Actions, GitLab CI, or other pipeline configurations
  • Documentation: Update any version references in README or documentation

Warning: Some packages may not yet support Python 3.13. Check package documentation or PyPI for compatibility information.

Monitoring Future EOL Dates

Python 3.13 active support ends October 1, 2026. This gives you approximately 18 months before security-only maintenance begins. Planning your next upgrade cycle now prevents last-minute scrambles.

Of course, version management isn’t a one-time task—it’s an ongoing practice. Tools like pip-audit, Dependabot, and Renovate can help automate dependency updates and security scanning.

Conclusion

With modern version managers, we can upgrade from Python 3.12 to 3.13 in a structured way. The key steps are:

  1. Install a version manager (mise or asdf)
  2. Install Python 3.13
  3. Update your project configuration
  4. Upgrade dependencies
  5. Audit and test thoroughly

Action: Start your upgrade today. Even if you don’t deploy immediately, having Python 3.13 installed and tested ensures you’re ready when needed.

Note: This article was written in March 2026. Python release dates and EOL timelines may change. Always verify current information at endoflife.date/python and PEP 693 before making upgrade decisions.

Questions? What’s your experience upgrading Python versions? Share your tips and challenges in the comments below.

Sponsored by Durable Programming

Need help maintaining or upgrading your Python application? Durable Programming specializes in keeping Python apps secure, performant, and up-to-date.

Hire Durable Programming