You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
messense 52aa4bbc3f
Merge pull request #303 from messense/abi3audit
2 weeks ago
.github Merge pull request #303 from messense/abi3audit 2 weeks ago
docs Add `RustBin` to API reference 5 months ago
emscripten micropip install beautifulsoup4 4 months ago
examples Merge pull request #299 from PyO3/dependabot/cargo/examples/namespace_package/pyo3-0.17.2 4 weeks ago
setuptools_rust Fix segfaults caused by modifying existing shared library (#295) 2 months ago
tests fix `get_lib_name` (#280) 4 months ago
.bumpversion.cfg release: 1.5.2 2 months ago
.gitattributes Set HTML files as vendored to fix the language in Github 4 years ago
.gitignore Replace `setuptools-scm` with bumpversion 4 months ago
.readthedocs.yaml docs: add sphinx / readthedocs configuration 2 years ago Fix segfaults caused by modifying existing shared library (#295) 2 months ago
LICENSE Add license file 4 years ago Remove README.rst from 2 years ago Add `pyproject.toml` to examples 6 months ago
mypy.ini ci: add mypy typecheck 1 year ago release: 1.5.0 4 months ago
pyproject.toml Replace `setuptools-scm` with bumpversion 4 months ago
setup.cfg release: 1.5.2 2 months ago refactoring: tidy up library and reuse more logic (#116) 2 years ago

Setuptools plugin for Rust extensions

github actions pypi package readthedocs code style: black

setuptools-rust is a plugin for setuptools to build Rust Python extensions implemented with PyO3 or rust-cpython.

Compile and distribute Python extensions written in Rust as easily as if they were written in C.


For a complete example, see html-py-ever.

First, you need to create a bunch of files:

from setuptools import setup
from setuptools_rust import Binding, RustExtension

    rust_extensions=[RustExtension("hello_rust.hello_rust", binding=Binding.PyO3)],
    # rust extensions are not zip safe, just like C-extensions.

For a complete reference of the options supported by the RustExtension class, see the API reference.


requires = ["setuptools", "wheel", "setuptools-rust"]

This file is required for building source distributions

include Cargo.toml
recursive-include src *


You can use same commands as for c-extensions. For example:

>>> python ./ develop
running develop
running egg_info
writing hello-rust.egg-info/PKG-INFO
writing top-level names to hello_rust.egg-info/top_level.txt
writing dependency_links to hello_rust.egg-info/dependency_links.txt
reading manifest file 'hello_rust.egg-info/SOURCES.txt'
writing manifest file 'hello_rust.egg-info/SOURCES.txt'
running build_ext
running build_rust
cargo build --manifest-path extensions/Cargo.toml --features python3
    Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs

Creating /.../lib/python3.6/site-packages/hello_rust.egg-link (link to .)

Installed hello_rust
Processing dependencies for hello_rust==1.0
Finished processing dependencies for hello_rust==1.0

Or you can use commands like bdist_wheel (after installing wheel). See also the notes in the documentation about building wheels.

Cross-compiling is also supported, using one of crossenv, cross or cargo-zigbuild. For examples see the test-crossenv and test-cross and test-zigbuild Github actions jobs in ci.yml.

By default, develop will create a debug build, while install will create a release build.


  • build - Standard build command will also build all rust extensions.
  • build_rust - Command builds all rust extensions.
  • clean - Standard clean command executes cargo clean for all rust extensions.