Structurer
son projet
Isolation des dépendances avec venv, gestion des paquets avec pip, et structure standard d'un projet Python.
Pourquoi isoler les dépendances ?
Sans venv : tous les projets partagent les mêmes paquets installés globalement. Projet A a besoin de requests==2.28, projet B a besoin de requests==2.31 → conflit insoluble.
Avec venv : chaque projet a son propre dossier venv/ avec ses propres paquets, indépendants des autres projets et du Python système.
Règle absolue : un projet = un environnement virtuel. Toujours activer le venv avant de travailler sur un projet. Jamais installer des paquets avec pip install globalement (sans venv actif).
venv — module intégré Python
Ne jamais committer le dossier venv/ dans Git — il est lourd (~50 Mo) et propre à chaque machine. Toujours l'ajouter au .gitignore.
pip & requirements
requirements.txt — exemple
# Dépendances exactes (pip freeze)
requests==2.31.0
numpy==1.26.4
pytest==8.1.1
# Ou avec plage de versions
requests>=2.28,<3.0
numpy>=1.24
Séparer les dépendances de développement : requirements.txt pour la prod, requirements-dev.txt pour pytest, black, mypy, etc.
.gitignore Python standard
# Environnement virtuel
venv/
.venv/
env/
# Cache Python
__pycache__/
*.py[cod]
*.pyo
# Distribution / packaging
dist/
build/
*.egg-info/
# Tests
.pytest_cache/
.coverage
htmlcov/
# IDE
.vscode/
.idea/
*.swp
# Variables d'environnement sensibles
.env
*.env
Générer automatiquement un .gitignore complet sur gitignore.io en cherchant "Python".
Structure standard
Une structure claire facilite la collaboration, les tests et le déploiement. Voici la structure recommandée pour un projet Python de taille moyenne.
Le dossier tests/ est au même niveau que le package, pas à l'intérieur. Cela évite d'inclure les tests dans la distribution.
Rôle de __init__.py
Modules & packages
class Utilisateur:
def __init__(self, nom: str, email: str):
self.nom = nom
self.email = email
def __repr__(self):
return f"Utilisateur({self.nom!r})"
# Exposer l'API publique du package
from .utilisateur import Utilisateur
# Maintenant : from mon_projet.models import Utilisateur
# Import absolu (recommandé)
from mon_projet.models import Utilisateur
from mon_projet.utils.helpers import formater
# Import relatif (dans un package)
from .models import Utilisateur
from ..utils import helpers
# Point d'entrée
if __name__ == "__main__":
u = Utilisateur("Alice", "alice@example.com")
print(u)
if __name__ == "__main__": est essentiel. Sans lui, le code s'exécute même quand le fichier est importé par un autre module.
Imports propres
# 1. Bibliothèque standard Python
import os
import sys
from pathlib import Path
from typing import List, Optional
# 2. Paquets tiers (pip install)
import requests
from flask import Flask
# 3. Modules locaux du projet
from mon_projet.models import Utilisateur
from .utils import helpers
# À ÉVITER
from os import * # import wildcard — pollue le namespace
import os, sys, pathlib # plusieurs imports sur une ligne
pyproject.toml — configuration moderne
Remplace progressivement setup.py et setup.cfg. Fichier unique de configuration du projet.
[build-system]
requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.backends.legacy:build"
[project]
name = "mon-projet"
version = "0.1.0"
description = "Description du projet"
requires-python = ">=3.10"
dependencies = [
"requests>=2.28",
]
[project.optional-dependencies]
dev = [
"pytest>=8.0",
"black>=24.0",
"mypy>=1.8",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
[tool.black]
line-length = 88
target-version = ["py310"]
[tool.mypy]
python_version = "3.10"
strict = true
Cheat sheet
venv — commandes
| python -m venv venv | Créer |
| source venv/bin/activate | Activer (Mac/Linux) |
| venv\Scripts\activate | Activer (Windows) |
| deactivate | Désactiver |
pip — commandes
| pip install X | Installer |
| pip install -r req.txt | Depuis fichier |
| pip freeze > req.txt | Geler |
| pip list | Lister |
| pip show X | Infos sur X |
Règles d'or
| Un projet | = un venv |
| venv/ | Dans .gitignore |
| requirements.txt | Commité |
| __init__.py | Dans chaque dossier |
| tests/ | Hors du package |