Rye : Le meilleur ami de vos projets Python ?
Encore un package manager...
Table of Contents
Soyons honnête, la gestion d'un projet et de ses dépendances en Python a toujours été plus compliqué qu'ailleurs. La où vous avez cargo en Rust, npm en JavaScript ou encore composer en PHP, le nombre d'outils en Python est sans commune mesure.
Il y a pip bien sur, qui est installé avec Python, mais aussi pip-tools pour épingler vos dépendances. Et vous avez les solutions plus complètes comme Pipenv, Poetry, Hatch, PDM et dernièrement Rye dont je vais vous parler.
C'est un projet plutôt récent, écrit en Rust (par
Gestion de Python
Première fonctionnalité super pratique : plus besoin d'installer Python. Rye va automatiquement installer une version portable de Python qu'il va télécharger via python-build-standalone. Vous avez juste à définir la version de Python que vous souhaitez utiliser pour votre projet, soit lors du rye init, soit plus tard avec rye pin.
Ça simplifie énormément la gestion de votre environnement de développement, et l'onboarding de nouveaux développeurs. Ça aussi permet d'avoir plusieurs versions de Python dans différents projets sans rien installer de plus que Rye.
Gestion des virtualenvs
Seconde fonctionnalité super pratique : plus besoin de créer vos virtualenvs à la main. Comme pour Python, Rye s'occupe de tout. Il va automatiquement créer un virtualenv pour votre projet dans le dossier .venv/. Ce dossier est reconnu automatiquement par certains IDE comme PyCharm qui va automatiquement utiliser l'environnement quand vous ouvrez le projet : plus aucune configuration à faire.
Gestion des dépendances
Troisième fonctionnalité essentielle : la gestion des dépendances. Vous pourrez donc ajouter (rye add), mettre à jour (rye sync --update) ou supprimer des dépendances (rye remove) dans votre projet.
Vous pouvez spécifier les dépendances de développement avec l'option --dev.
Rye se charge aussi d'épingler vos dépendances dans une version précise, grâce à pip-tools ou uv. Le second est bien plus rapide que le premier (encore rust !) et proposé par défaut dans les dernières versions de Rye.
Vous aurez donc deux fichiers, requirements.lock et requirements-dev.lock qui contiendront toutes vos dépendances.
Scripts, formatter, linter, tests
En plus de ces fonctionnalités essentielles, vous avez aussi une intégration native de ruff avec les commandes rye fmt et rye lint, sans même ajouter ruff comme dépendance de votre projet, c'est automatique.
La commande rye run vous permettra quand à elle d'invoquer les scripts installés dans votre environnement, comme django-admin ou uvicorn par exemple sans avoir besoin d'activer votre virtualenv.
Vous pouvez aussi définir vos propres scripts.
Pour finir, la commande rye test exécutera pytest si il est installé dans votre projet.
Mise en place d'un projet avec Rye
Place à la pratique, nous allons créer un petit projet qui contient une application web écrite avec FastAPI et les tests associés.
Création du projet
Quand vous installez Rye il installe par défaut la dernière version de Python. Nous allons donc utiliser une version un peu plus ancienne (3.11) pour la démonstration.
$ rye init --py 3.11 demo-rye
$ cd demo-rye
$ rye sync
Après ces trois commandes :
- Python 3.11 aura été téléchargé et installé
- Un virtulenv utilisant cette version de Python aura été créé dans le dossier
.venv - Un template de projet aura été mis en place:
pyproject.toml,src/,README.mdetc. - La commande
git initaura été exécutée
Ajout des dépendances
Nous allons maintenant installer FastAPI et Uvicorn comme dépendance.
$ rye add fastapi uvicorn[standard]Cette commande va ajouter les dépendances dans notre pyproject.toml, puis les installer dans notre virtualenv. On peut vérifier que ça fonctionne en lançant uvicorn :
$ rye run uvicorn --version
Running uvicorn 0.29.0 with CPython 3.11.8 on Linux
Astuce : Si vous lancez python dans un dossier contenant un projet géré par Rye, ça lancera le Python présent dans le virtualenv du projet. Plus d'informations sur cette fonctionnalité dans la documentation.
On en profite aussi pour installer pytest, uniquement en dépendance de dev.
$ rye add --dev pytest
Développement
On va créer un fichier main.py dans src/demo_rye/, pour y ajouter le code de notre application FastAPI, directement copié de la documentation de FastAPI.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}On peut ensuite lancer notre application :
$ rye run uvicorn demo_rye.main:app
INFO: Started server process [4677]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: 127.0.0.1:35792 - "GET / HTTP/1.1" 200 OK
INFO: 127.0.0.1:35792 - "GET /favicon.ico HTTP/1.1" 404 Not Found
On peut forcer le formatage avec ruff et lancer le linter :
$ rye fmt
$ rye lint
Tests
Le TestClient de FastAPI utilise httpx, on doit donc l'ajouter.
$ rye add --dev httpx
On ajoute notre test dans tests/test_main.py:
from demo_rye.main import app
from fastapi.testclient import TestClient
client = TestClient(app)
def test_get_main():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}Puis on lance les tests :
$ rye test
Running tests for demo-rye (/home/thibaut/demo-rye)
=================================================================== test session starts ====================================================================
platform linux -- Python 3.11.8, pytest-8.1.1, pluggy-1.4.0
rootdir: /home/thibaut/demo-rye
configfile: pyproject.toml
plugins: anyio-4.3.0
collected 1 item
tests/test_main.py . [100%]
==================================================================== 1 passed in 0.50s =====================================================================
Conclusion
Je trouve Rye très prometteur car il fait parti de ces outils dont on peut dire It just works. Je l'ai utilisé testé sous Windows, Mac et Linux sans aucun soucis, il est performant et la communauté est active.
Alors une chose est sure, tous mes nouveaux projets utiliseront Rye... jusqu'à qu'un nouveau package manager débarque ? 😈
