Skip to main content

Python package setup for adding some additional rust functions

Project description

Python package with Rust

Python package with some functions in Rust using PyO3 and Maturin. Maturin was made for all Rust python packages. How mixed packages work is mentioned in the README. Some fiddling has to be done with the project structure, Cargo.toml, pyproject.toml to get everything right. It should be possible to:

  1. test the package locally (after building the Rust part)
  2. buid the package with both Rust and Python

Development Setup

Install all dependencies including Maturin.

# using conda environments here
conda env create -f environment.yml
conda activate lutz

There is a python package python/lutz/ and a Rust library rust/lib.rs. In lib.rs a python module is implemented which is referenced in Cargo.toml in lib.name.

# build rust library
maturin develop

The library is build and a resulting _lib.*.so file is placed in python/lutz. This is defined in pyproject.toml under [tool.maturin]. From now on rust functions can be imported as private _lib. I wrote a wrapper in python/lutz/rust.py.

Both Cargo.toml and pyproject.toml define package name and version number but pyproject.toml takes precendence.

Note .vscode/settings.json and vscode.env is setup for being able to import lutz from the integrated python terminal and Jupyter notebooks, as well as tell pylint how to import lutz.

Tests

Using pytest python test suite. _lib.*.so in python/lutz/ must have been built before (maturin develop).

pytest tests

Build and release

Maturin can build and publish the package wheel and source distribution. By default the --release flag is used for building the rust library (performance optimizations) and files are uploaded to pypi.org.

maturin publish

The above will only create a wheel for this architecture, platform, and python version. More generic releases are explained in the Maturin tutorial. There are some caveats with each platform. To make things simple, Maturin offers a command to generate a CI workflow for different platforms. Here, I am generating a github workflow for publishing.

mkdir -p .github/workflows
maturin generate-ci --pytest github > .github/workflows/CI.yml

It uses github/maturin-action. Per default it will push to pipy.org and use token authentication. Create API token on pypi.org and add it as secret to the github repository. As you can see in the CI.yml the name of this secret should be PYPI_API_TOKEN. I edited the trigger to tags: ['v*'] to not run on every push. Trigger with e.g.:

TAG='v0.1.1'
git tag "$TAG" && git push origin "$TAG"

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

lutz-0.1.9.tar.gz (18.9 kB view hashes)

Uploaded Source

Built Distributions

lutz-0.1.9-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lutz-0.1.9-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

lutz-0.1.9-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

lutz-0.1.9-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

lutz-0.1.9-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

lutz-0.1.9-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.5+ i686

lutz-0.1.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

lutz-0.1.9-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

lutz-0.1.9-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

lutz-0.1.9-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

lutz-0.1.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

lutz-0.1.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.5+ i686

lutz-0.1.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ s390x

lutz-0.1.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ppc64le

lutz-0.1.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARMv7l

lutz-0.1.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

lutz-0.1.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

lutz-0.1.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

lutz-0.1.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

lutz-0.1.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

lutz-0.1.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

lutz-0.1.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.5+ i686

lutz-0.1.9-cp312-cp312-macosx_11_0_arm64.whl (249.8 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

lutz-0.1.9-cp312-cp312-macosx_10_7_x86_64.whl (253.4 kB view hashes)

Uploaded CPython 3.12 macOS 10.7+ x86-64

lutz-0.1.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

lutz-0.1.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

lutz-0.1.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

lutz-0.1.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

lutz-0.1.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

lutz-0.1.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.5+ i686

lutz-0.1.9-cp311-cp311-macosx_11_0_arm64.whl (250.3 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

lutz-0.1.9-cp311-cp311-macosx_10_7_x86_64.whl (254.2 kB view hashes)

Uploaded CPython 3.11 macOS 10.7+ x86-64

lutz-0.1.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

lutz-0.1.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

lutz-0.1.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

lutz-0.1.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

lutz-0.1.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

lutz-0.1.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.5+ i686

lutz-0.1.9-cp310-cp310-macosx_11_0_arm64.whl (250.3 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

lutz-0.1.9-cp310-cp310-macosx_10_7_x86_64.whl (254.2 kB view hashes)

Uploaded CPython 3.10 macOS 10.7+ x86-64

lutz-0.1.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

lutz-0.1.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

lutz-0.1.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

lutz-0.1.9-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

lutz-0.1.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

lutz-0.1.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.5+ i686

Supported by

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