updated: 2026-04-10T17:26:56.213031846-07:00[America/Los_Angeles]
README
ry
python bindings for rust crates ~ ry == rust | python
DOCS: ryo3.dev (WIP)
API: ryo3.dev/api
This is a work in progress ~ feedback and PRs are welcome.
Highlights
- Async/Blocking http-clients: Built on
reqwest, with afetch-like API. Supports streaming, zero-copy IO (via the buffer protocol), timeouts, redirect-following, and native JSON (de)serialization. WebSocketclient: Built ontokio-websocketsand styled after jawascript’sWebSocketAPI.jiffbased datetime library: comprehensive datetime library based onjiff(pydantic-compatible).- Async file I/O:
AsyncFileAPI similar toaiofilesandanyio’s async-file api. - (de)compression: (de)compression support for
zstd,brotli,gzip, andbzip2. - hashing:
aws-lc-rs,fnv, andtwox-hash(akaxxhash) - Ergonomic: APIs designed to be ergonomic and pythonic and familiar to both python and rust users.
- Type Annotated: All public APIs are (painstakingly) type annotated and checked.
- Performant: Speed without the words “blazingly fast.” 1
- Pydantic Integration: ry data types (mostly) work good w/ pydantic.
- Not slop: Artisanal, hand-crafted, grassfed, fair-trade, small-batch software.
- No emojis
- MANY crate bindings see below.
Install
pip install ry
uv add ry
uv pip install ry
# check install
python -m ry
# run & check install w/ uv
uv run --with ry python -m ry
Quickstart
Bop around the
./examples to see some
of what ry can do.
Or to play with ry in a repl, run the following:
# repl w/ ipython
uv run --with ry,ipython python -m ry.dev
# repl w/o ipython
uv run --with ry python -m ry.dev
What?
ry– the python packageryo3-*– the rust crates that are used byryand possibly your ownpyo3-based python package
Who?
- jessekrubin jessekrubin@gmail.com
- possibly you!?
FAQ
(aka: questions that I have been asking myself)
- Q: Why?
- A: I (jesse) needed several hashing functions for python and then kept adding things as I needed them
- Q: Does this have anything to do with the (excellent) package manager
rye?- A: short answer: no. long answer: no, it does not.
- Q: Why is the repo split into
ryandryo3?- A:
ryis the python package,ryo3is a rust crate setup to let you “register” functions you may want if you were writing your own pyo3-python bindings library; maybe someday theryo3::libsmodule will be split up into separate packages
- A:
Crate bindings
| crate | ryo3-crate |
|---|---|
std | ryo3-std |
bytes | ryo3-bytes |
bzip2 | ryo3-bzip2 |
dirs | ryo3-dirs |
fspath | ryo3-fspath |
glob | ryo3-glob |
heck | ryo3-heck |
http | ryo3-http |
jiter | ryo3-jiter |
json | ryo3-json |
pydantic | ryo3-pydantic |
reqwest | ryo3-reqwest |
serde | ryo3-serde |
shlex | ryo3-shlex |
size | ryo3-size |
sqlformat | ryo3-sqlformat |
tokio | ryo3-tokio |
tokio-websockets | ryo3-tokio-websockets |
ulid | ryo3-ulid |
unindent | ryo3-unindent |
url | ryo3-url |
uuid | ryo3-uuid |
which | ryo3-which |
| Compression | ~ |
brotli | ryo3-brotli |
flate2 | ryo3-flate2 |
zstd | ryo3-zstd |
| Hashing | ~ |
aws-lc-rs | ryo3-aws-lc |
fnv | ryo3-fnv |
twox-hash | ryo3-twox-hash |
| @BurntSushi | ~ |
globset | ryo3-globset |
jiff | ryo3-jiff |
memchr | ryo3-memchr |
regex | ryo3-regex |
same-file | ryo3-same-file |
walkdir | ryo3-walkdir |
DEV
justis used to run tasks- Do not use the phrase
blazing fastor any emojis in any PRs or issues or docs - type annotations are required
ruffused for formatting and linting
SEE ALSO
- utiles: web-map tile utils
-
Release‑version benchmarks of
ry(viapytest-benchmark) showed no real performance variance, regardless of whether “blazingly fast” appeared in the README or docs. ↩