Skip to main content

Setuptools Rust extension plugin

Project description

Setuptools plugin for Rust extensions

example workflow 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.

Setup

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

First, you need to create a bunch of files:

setup.py

from setuptools import setup
from setuptools_rust import Binding, RustExtension

setup(
    name="hello-rust",
    version="1.0",
    rust_extensions=[RustExtension("hello_rust.hello_rust", binding=Binding.PyO3)],
    packages=["hello_rust"],
    # rust extensions are not zip safe, just like C-extensions.
    zip_safe=False,
)

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

MANIFEST.in

This file is required for building source distributions

include Cargo.toml
recursive-include src *

pyproject.toml

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

build-wheels.sh

#!/bin/bash
set -ex

curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable -y
export PATH="$HOME/.cargo/bin:$PATH"

cd /io

for PYBIN in /opt/python/cp{35,36,37,38,39}*/bin; do
    "${PYBIN}/pip" install -U setuptools wheel setuptools-rust
    "${PYBIN}/python" setup.py bdist_wheel
done

for whl in dist/*.whl; do
    auditwheel repair "$whl" -w dist/
done

Usage

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

>>> python ./setup.py 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).

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

Binary wheels on linux

To build binary wheels on linux, you need to use the manylinux docker container. You also need a build-wheels.sh similar to the one in the example, which will be run in that container.

First, pull the manylinux2014 Docker image:

docker pull quay.io/pypa/manylinux2014_x86_64

Then use the following command to build wheels for supported Python versions:

docker run --rm -v `pwd`:/io quay.io/pypa/manylinux2014_x86_64 /io/build-wheels.sh

This will create wheels in the dist directory:

$ ls dist
hello_rust-0.1.0-cp35-cp35m-linux_x86_64.whl          hello_rust-0.1.0-cp35-cp35m-manylinux2014_x86_64.whl
hello_rust-0.1.0-cp36-cp36m-linux_x86_64.whl          hello_rust-0.1.0-cp36-cp36m-manylinux2014_x86_64.whl
hello_rust-0.1.0-cp37-cp37m-linux_x86_64.whl          hello_rust-0.1.0-cp37-cp37m-manylinux2014_x86_64.whl
hello_rust-0.1.0-cp38-cp38-linux_x86_64.whl           hello_rust-0.1.0-cp38-cp38-manylinux2014_x86_64.whl
hello_rust-0.1.0-cp39-cp39-linux_x86_64.whl           hello_rust-0.1.0-cp39-cp39-manylinux2014_x86_64.whl

You can then upload the manylinux2014 wheels to pypi using twine.

It is possible to use any of the manylinux docker images: manylinux1, manylinux2010 or manylinux2014. (Just replace manylinux2014 in the above instructions with the alternative version you wish to use.)

Binary wheels on macOS

For building wheels on macOS it is sufficient to run the bdist_wheel command, i.e. setup.py bdist_wheel.

To build universal2 wheels set the ARCHFLAGS environment variable to contain both x86_64 and arm64, for example ARCHFLAGS="-arch x86_64 -arch arm64". Wheel-building solutions such as cibuildwheel set this environment variable automatically.

Commands

  • build - Standard build command builds all rust extensions.
  • build_rust - Command builds all rust extensions.
  • clean - Standard clean command executes cargo clean for all rust extensions.
  • check - Standard check command executes cargo check for all rust extensions.
  • tomlgen_rust - Automatically generate a Cargo.toml manifest based on Python package metadata. See the example project on GitHub for more information about this command.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

setuptools-rust-0.12.0.tar.gz (282.5 kB view details)

Uploaded Source

Built Distribution

setuptools_rust-0.12.0-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

Details for the file setuptools-rust-0.12.0.tar.gz.

File metadata

  • Download URL: setuptools-rust-0.12.0.tar.gz
  • Upload date:
  • Size: 282.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for setuptools-rust-0.12.0.tar.gz
Algorithm Hash digest
SHA256 faacca4b85d5f43e9e3836418e1cbf9ed2576a27978b522f3d04513ef052cec5
MD5 8db2fb968c015774435ecba875856daa
BLAKE2b-256 5cb32a89091f10f3484e88b28c6b8ecbcbfd7f72cd59425b390bed1564d8b30a

See more details on using hashes here.

File details

Details for the file setuptools_rust-0.12.0-py3-none-any.whl.

File metadata

  • Download URL: setuptools_rust-0.12.0-py3-none-any.whl
  • Upload date:
  • Size: 22.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for setuptools_rust-0.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cdec24d2936e4173945b325498f28d7b599b4239abd9ca30e178a9415ebd6ba1
MD5 691abc1a7ec7a2afdec929850e02e785
BLAKE2b-256 3b14409b98b73834430ec3c3f028966419b4205cc15909e58059f6ed9b898471

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page