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:
| Phase | Date | Details |
|---|---|---|
| Release | Oct 2, 2023 | 3.12.0 |
| Active Support End | Apr 2, 2025 | No bugfixes |
| Security End | Oct 31, 2028 | Source-only |
| Latest: 3.12.13 | Mar 3, 2026 | Security 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:
| Phase | Date | Details |
|---|---|---|
| Release | Oct 7, 2024 | 3.13.0 |
| Active Support End | Oct 1, 2026 | Bugfixes end |
| Security End | Oct 31, 2029 | Final |
| Latest: 3.13.12 | Feb 3, 2026 | PEP 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:
| Tool | Pros | Cons | Best for |
|---|---|---|---|
| mise | Fast, multi-language, asdf-compatible | Newer, smaller ecosystem | Multi-language projects |
| asdf | Mature, plugin ecosystem, community | Slightly slower | Established workflows |
| uv | Extremely fast deps/resolution, Python-focused | Limited non-Python support | Dependency-heavy Python apps |
| pyenv | Reliable, simple Python-only | Slower builds, Python-only | Pure 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 checkorpip checkto validate dependency compatibility - C extensions: Recompile if needed (some packages require reinstallation)
- Tests: Run your full test suite with
pytestor your preferred test runner - Docker: Update your
Dockerfileto useFROM 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:
- Install a version manager (
miseorasdf) - Install Python 3.13
- Update your project configuration
- Upgrade dependencies
- 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