Rye for Python
Rye is a “comprehensive project and package management solution for Python” – let’s check it out!
Grab a cup of tea, pull up a chair and put to one side any cognitive bias you have! (Just because it’s built with Rust doesn’t mean you have to install Rust!!!).
I won’t regurgitate the excellent documentation from https://rye-up.com/ but what I will do is give a very short prelude and then a real world example which hopefully compliments what you see in the documentation.
Pip, Poetry, Wheel, Dist, TOML etc can be a lot to learn on top of the Python language itself. Then throw in virtual environments, versioning and you will typically have many people all doing things differently.
I’ve read people saying why is there a need for Rye, and why not use Poetry and so on. But hopefully this comment from Rye Discord helps?
I’ve observed development of rye-like tools over the years (conda, pipx, flit, hatch, posy, pixi, etc.). I’ve simultaneously updated a list of common features. Most tools do one or more of the following, but Rye is the only tool (so far) that does ALL and more:
A. Executor - bootstraps + installs python versions: `rye {fetch,toolchain,tools}`
B. Installer - install packages: `rye add`
C. Locker - creates a "lock file": `rye {sync,lock,pin}`
D. V-env manager - manages environments: `rye {sync,run,[un]install}`
E. App Runner - run packages w/entrypoints as apps: `rye {add,run}`
F. Script Runner - run custom scripts or tsks: `rye run <script-name>`
G. Packager - create wheels/zips: `rye buld`
H. Publisher - publish to pypi/pkg repo: `rye publish`
I. Project Manager - manage project metadata: `rye {init,add,remove,sync,show}`
J. Version Manager - manage bumping versions: `rye version`
K. Task Manager - manage shell-level tasks: `rye run <my-dev>`
So yes, Rye should exist ๐ A sincere Thank You!
pylang – Rye Discord
Once installed, do “rye init”
"Initialize a new or existing Python project with Rye"
This is my project “r1” – and if you follow the Rye documentation you’ll only see an example that uses __init__.py
I’ve added my own “main.py” and here’s the accompanying “pyproject.toml“
- r1 is the project name
- main is the file name
- greeting is the function name
[project.scripts]
hello = "r1:hello"
entry = 'r1.main:greeting'
โฏ tree -L 3
.
โโโ pyproject.toml
โโโ README.md
โโโ requirements-dev.lock
โโโ requirements.lock
โโโ src
โโโ r1
โโโ __init__.py
โโโ main.py
โโโ __pycache__
Let’s check out “main.py” :
# src/r1/main.py
def greeting():
print("\nHello from greeting function inside src/r1/main.py!\n")
if __name__ == "__main__":
greeting()
As you can see, there is a slight issue with a warning message on my installation, I’ve check the “issues” on GitHub and I can see this is being discussed. It’s just a warning about cloud/dropbox sync so not make or break!
โฏ tree -L 3
.
โโโ pyproject.toml
โโโ README.md
โโโ requirements-dev.lock
โโโ requirements.lock
โโโ src
โโโ r2
โโโ hello.py
โโโ __init__.py
[tool.rye.scripts]
dev = { cmd = "flask --app ./src/r2/hello.py run" }
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
Conclusion
I’m not here to persuade, but just to showcase what clearly has taken a lot of work and effort, and surely it is worth road testing, and/or contributing to or making constructive criticism?
The linter, and formatter alone are a great integration (Ruff), and if the Python world converges on Rye, or builds on it then surely it will benefit one and all?
โฏ rye
An Experimental Package Management Solution for Python
Usage: rye [COMMAND]
Commands:
add Adds a Python package to this project
build Builds a package for distribution
config Reads or modifies the global `config.toml` file
fetch Fetches a Python interpreter for the local machine
fmt Run the code formatter on the project
init Initialize a new or existing Python project with Rye
install Installs a package as global tool
lock Updates the lockfiles without installing dependencies
lint Run the linter on the project
make-req Builds and prints a PEP 508 requirement string from parts
pin Pins a Python version to this project
publish Publish packages to a package repository
remove Removes a package from this project
run Runs a command installed into this package
show Prints the current state of the project
sync Updates the virtualenv based on the pyproject.toml
toolchain Helper utility to manage Python toolchains
tools Helper utility to manage global tools
self Rye self management
uninstall Uninstalls a global tool
version Get or set project version
help Print this message or the help of the given subcommand(s)