18 breaking releases

0.24.0 Dec 29, 2022
0.23.0 Nov 8, 2022
0.22.0 Jun 5, 2022
0.20.0 Mar 6, 2022
0.6.0 Feb 13, 2020
Download history 1384/week @ 2023-10-17 1410/week @ 2023-10-24 1400/week @ 2023-10-31 1610/week @ 2023-11-07 1699/week @ 2023-11-14 2260/week @ 2023-11-21 2229/week @ 2023-11-28 2015/week @ 2023-12-05 1658/week @ 2023-12-12 1854/week @ 2023-12-19 1171/week @ 2023-12-26 1211/week @ 2024-01-02 1733/week @ 2024-01-09 1612/week @ 2024-01-16 1792/week @ 2024-01-23 1214/week @ 2024-01-30

6,645 downloads per month

Python-2.0 OR MPL-2.0

5.5K SLoC

Rust 3K SLoC // 0.2% comments Python 2.5K SLoC // 0.0% comments


pyembed is a Rust library crate facilitating the control of Python interpreters within Rust applications. It is a glorified wrapper around the pyo3 crate (which provides a Rust interface to Python's C APIs). Its main value proposition over using pyo3 directly is that it provides additional value-add features such as integration with the oxidized_importer extension module for importing Python modules and resources from memory.

pyembed is part of the PyOxidizer Project but it is usable by any Rust project embedding Python.


Control an embedded Python interpreter.

The pyembed crate contains functionality for controlling an embedded Python interpreter running in the current process.

pyembed provides additional functionality over what is covered by the official Embedding Python in Another Application docs and provided by the CPython C API. For example, pyembed can utilize a custom Python meta path importer that can import Python module bytecode from memory using 0-copy.

This crate was initially designed for and is maintained as part of the PyOxidizer project. However, the crate is generic and can be used outside the PyOxidizer project.

The most important types in this crate are [OxidizedPythonInterpreterConfig] and [MainPythonInterpreter]. An [OxidizedPythonInterpreterConfig] defines how a Python interpreter is to behave. A [MainPythonInterpreter] creates and manages that interpreter and serves as a high-level interface for running code in the interpreter.


Under the hood, pyembed makes direct use of the pyo3 crate for low-level Python FFI bindings as well as higher-level interfacing.

It is an explicit goal of this crate to rely on as few external dependencies as possible. This is because we want to minimize bloat in produced binaries.


The optional allocator-jemalloc feature controls support for using jemalloc as Python's memory allocator. Use of Jemalloc from Python is a run-time configuration option controlled by the [OxidizedPythonInterpreterConfig] type and having jemalloc compiled into the binary does not mean it is being used!

The optional allocator-mimalloc feature controls support for using mimalloc as Python's memory allocator. The feature behaves similarly to jemalloc, which is documented above.

The optional allocator-snmalloc feature controls support for using snmalloc as Python's memory allocator. The feature behaves similarly to jemalloc, which is documented above.

The optional serialization feature controls whether configuration types (such as [OxidizedPythonInterpreterConfig]) implement Serialize and Deserialize.


~290K SLoC