Illustrated Python development workflow linking code, testing, deployment, and cross-platform hardware.
CPython’s Rust work is proceeding toward Python 3.16 without making the Rust compiler a required part of every CPython build, preserving a C-only path for distributors, unusual platforms, and developers who compile the interpreter themselves. The Register reported the latest progress from RustConf, but the more consequential fact is that the project made this policy retreat months earlier: on November 18, 2025, proposal author Emma Smith said the in-discussion plan would cover only optional Rust extension modules, leaving any mandatory Rust dependency to a separate future PEP.

That timing correction matters. This is not a last-minute reversal after RustConf, nor is Python 3.16 on track to force rustc into Windows, Linux, or embedded build pipelines. It is a gradual integration project whose near-term deliverable is an internal interface for CPython contributors—not a public Rust replacement for the Python C API and not a rewrite of the interpreter.

For developers and enterprise teams that build Python from source, the immediate instruction is simple: do not add Rust as a baseline CPython build prerequisite yet. Watch the Python 3.16 development cycle, but distinguish optional components from the official interpreter’s minimum toolchain.

The mandatory-Rust plan was withdrawn in November 2025​

Smith and Kirill Podoprigora’s original pre-PEP proposed a phased route from optional Rust modules toward Rust becoming compulsory for CPython builds. The draft floated warnings in Python 3.15, a Rust check in Python 3.16, and a possible hard requirement in Python 3.17. That roadmap attracted objections over portability, bootstrapping, contributor burden, dependency management, and build time.

The objections were not merely ideological resistance to Rust. CPython supports a long tail of operating systems and architectures beyond the mainstream Windows, macOS, and Linux configurations. A hard Rust dependency would mean each of those environments needs a supported compiler, a viable bootstrap chain, and a package-maintenance story—requirements that can be modest on a developer workstation but painful for downstream maintainers and legacy systems.

The build chain also has an awkward circularity. Rust’s own compiler build process has historically used Python tooling, so making CPython dependent on Rust creates a bootstrapping question for projects that build a complete toolchain from source. The original discussion acknowledged that issue; critics argued it had not been solved sufficiently to justify turning Rust into an unconditional dependency.

Smith’s November update explicitly narrowed the proposal after that feedback. It said the optional approach was intended to address bootstrapping, language portability, and churn. The Register’s framing of the project “backing off” is directionally right, but its account places the amendment in May. The primary Python.org discussion records the change on November 18, 2025—one day after the original proposal was posted.

That is more than a calendar error. It shows that the current RustConf presentation reflects implementation work under a settled narrower scope, rather than a newly negotiated compromise.


Python 3.16 is the first target, not a Rust mandate​

Python Insider’s April 2026 project update set Python 3.16 as the first planned release to include Rust code, moving the target from Python 3.15. The same update said the proposed Rust API would remain internal until another PEP defines and stabilizes it for public use.

That boundary is essential for extension authors. Python programmers already use Rust through projects such as PyO3 and maturin to create native modules. The CPython effort does not suddenly make a new official Rust interface available for third-party packages in 3.16. Nor does it replace existing C extension APIs, stable ABI work, wheel-building practices, or Windows package deployment.

Instead, the project is trying to give CPython’s own maintainers a way to write selected optional modules in Rust while retaining control over the internal interfaces those modules need. Building those bindings internally avoids taking a permanent dependency on PyO3’s release cadence and design decisions, but it also means the first interface is deliberately not a contract that external projects should rely upon.

The April roadmap was itself careful: it described a PEP as forthcoming, said the timeline was subject to change, and anticipated a lengthy discussion before Python 3.16 beta 1 in May 2027. The planned final release is expected later in 2027, but the Rust component’s scope remains dependent on that PEP process and the implementation proving viable across CPython’s supported build configurations.

Guido van Rossum has endorsed the incremental direction, arguing in the original discussion that a wholesale rewrite in Rust would not work and that less-essential components should come first. That is a practical constraint, not a branding exercise. CPython has decades of C code, a large extension ecosystem, and very tight compatibility expectations; a mixed-language core introduces a foreign-function boundary that must be engineered carefully rather than treated as a blanket memory-safety fix.

The zlib-rs detail is narrower than it first appears​

The Register says Python 3.16 will include the Rust zlib compression library as a test crate. CPython’s current 3.16 “What’s New” documentation describes a more specific arrangement: source builders can choose zlib-rs or libbzip2-rs as alternatives to the default system zlib and bzip2 libraries through new configuration options.

This is an implementation choice for source builders, not evidence that CPython will bundle Rust into every Python installation or require every administrator to install Cargo. The documented options also retain the normal system-library path and include choices for zlib-ng or disabling the compression modules altogether where that is appropriate.

It is nevertheless a meaningful test. Compression modules are a useful proving ground because they put real Rust libraries behind established Python module interfaces. If the build integration, linking behavior, compatibility testing, and packaging processes work there, CPython gains evidence for—or against—using Rust in future optional modules.

The inclusion of both zlib-rs and libbzip2-rs also undercuts the idea that the project is centered on one showcase crate. What is being tested is the relationship between CPython’s build system and Rust-produced native libraries: how dependencies are acquired or vendored, how symbols are linked, how dynamic modules are built, and whether maintainers can reproduce builds across platforms.

For Windows users of prebuilt Python releases, none of this changes the normal installation path. For Windows developers compiling CPython or maintaining custom distributions, it means Rust-enabled modules may eventually become a configurable build choice, rather than a toolchain gate imposed on every build.


Memory safety stops at the language boundary​

Rust can prevent many categories of memory errors in safe Rust code, including use-after-free and out-of-bounds access. It cannot automatically make the C and Rust boundary safe. CPython’s internal object model, reference counting, interpreter state, allocation rules, and extension interfaces were designed around C; any Rust module interacting with them needs carefully designed unsafe bindings and clear lifetime rules.

That is why the work described at RustConf is concentrated on API design, compiler and build-system compatibility, and cross-language diagnostics. A Rust module can reduce the amount of unsafe code that must be manually maintained, but it cannot erase the unsafe layer required to exchange Python objects and runtime state with C. The quality of that layer will decide whether the project produces a maintenance gain or just relocates complexity.

Free-threaded CPython gives the effort an additional reason to be cautious. Rust’s type system can help prevent data races within appropriately written Rust code, but CPython’s thread-safety rules and runtime behavior still govern the boundary. A Rust component that calls into shared interpreter internals must obey the same locking and object-lifetime constraints as C code.

For sysadmins, the near-term risk is therefore operational rather than compatibility-related: downstream distributions may experiment with Rust-backed optional modules at different rates. Teams that require reproducible builds should track exactly which compression backend and compiler toolchain their Python packages use, rather than assuming that “Python built with Rust” describes a uniform or upstream-mandated configuration.

The next milestone is a PEP with a real support contract​

The project’s success should not be judged by whether a Rust crate lands in Python 3.16. A small optional module can demonstrate that the plumbing works; it does not answer whether CPython can support Rust across its full platform policy, preserve fast contributor build loops, maintain reproducible releases, and define safe internal abstractions without burdening C-focused maintainers.

Those questions are supposed to be tested before anyone revisits a mandatory Rust toolchain. The proposal’s own revised scope puts that decision in a future PEP, where downstream packagers, alternative-platform maintainers, Windows builders, and CPython contributors can evaluate evidence rather than a speculative timetable.

For now, CPython’s direction is narrower and more credible: use Python 3.16 to validate optional Rust components, keep the API internal, and avoid forcing a compiler transition before the project can demonstrate that its portability and maintenance costs are contained.