Python : l'environnement

nora.nckm.eu

Illustration
Table des matières

Cette page présente l'environnement de développement Python. D'autres mémos sont disponibles dans les pages suivantes : les bases, l'orienté objet et les modules.

Environnements de développement

VSCodium

Éditeur de code pour les petits projets ou l'édition de scripts.

VSCodium est une version libre et sans télémétrie de Visual Studio Code. Elle est construite à partir des mêmes sources.

Sous Arch Linux il faut installer les packages AUR vscodium-bin et vscodium-bin-marketplace. Ensuite les extensions suivantes peuvent être ajoutées :

VSCodium

Fleet

Environnement de développement intégré léger et multilangage.

Fleet est l'IDE nouvelle génération de JetBrains en réponse à Visual Studio Code.

Sous Arch Linux il faut installer le package AUR jetbrains-fleet.

Fleet

PyCharm

Environnement de développement intégré pour les projets plus importants.

Il existe une version "community" gratuite et une version "professional" payante incluant la prise en charge du développement Web : HTML, JS, SQL...

PyCharm contient de base toutes les fonctionnalités nécessaires pour coder en Python.

Sous Arch Linux il faut installer le package pycharm-community-edition. Pour améliorer la lisibilité du code, installer les polices Fira Code (ttf-fira-code) ou JetBrains Mono (ttf-jetbrains-mono).

Attention : sous Wayland il faut ajouter la variable d'environnement suivante pour que ça fonctionne.

# bash : .bashrc
export _JAVA_AWT_WM_NONREPARENTING=1

# fish
set -xg _JAVA_AWT_WM_NONREPARENTING 1

PyCharm

Les principaux raccourcis clavier :

Maj Maj
Recherche globale
Ctrl + Maj + F / R
Recherche / remplacement dans le projet
Ctrl + Space / Tab
Complétion de code / remplacement
Ctrl + Maj + Space
Complétion de code intelligente
Alt + Entrée
Actions contextuelles
Ctrl + B / Clique gauche
Déclaration / implémentation(s)
Ctrl + Q
Documentation rapide
Ctrl + /
Commentaires de ligne
Ctrl + Alt + O
Optimisation des imports
Ctrl + Alt + L
Formatage du code
Ctrl + Alt + I
Indentation automatique
Ctrl + W / Ctrl + Maj + W
Sélection étendre / diminuer
Ctrl + - / +
Plier / déplier un bloc
Ctrl + Maj + - / +
Plier / déplier tous les blocs de code
Ctrl + Maj + Bas / Haut
Déplacer une ligne ou un bloc
Ctrl + X / C / D
Couper / copier / dupliquer une ligne
Ctrl + Alt + <- / ->
Naviguer en avant / arrière

Note : l'outil Emmet inclus dans PyCharm, défini une syntaxe d'abréviations qui permet d'ajouter des fonctionnalités d'autocomplétion puissantes dans les fichiers HTML et CSS.

JupyterLab

Environnement de développement orienté science des données et formation. Il s'agit d'un cahier de laboratoire pour expérimenter, documenter et partager du code Python.

JupyterLab se lance avec la commande jupyter-lab et s'ouvre automatiquement dans le navigateur.

JupyterLab

Astuce : PythonAnywhere propose des instances avec ses offres payantes.


Note : Streamlit est un module qui permet de transformer des scripts de données en applications web.

Environnements virtuels : venv

Un environnement virtuel est un espace isolé du système dans lequel est installé une version spécifique de l'interpréteur Python et des modules nécessaires au fonctionnement d'un projet.

La commande suivante crée un environnement virtuel dans le répertoire courant avec le module venv :

python3.10 -m venv .env

L'arborescence suivante est créée :

.env
├── bin
│    ├── activate
│    ├── activate.csh
│    ├── activate.fish
│    ├── Activate.ps1
│    ├── pip
│    ├── pip3
│    ├── pip3.10
│    ├── python -> python3.10
│    ├── python3 -> python3.10
│    └── python3.10 -> /sbin/python3.10
├── lib
│    └── python3.10
└── pyvenv.cfg

Pour activer et désactiver l'environnement virtuel :

~/project$ source .env/bin/activate
(.env) ~/project$ which python
(.env) ~/project$ pip list
(.env) ~/project$ deactivate

Astuce : avec le shell fish lancer le script activate.fish.

Gestionnaire de paquets : pip

Le gestionnaire de paquets PIP permet d'installer des modules, des bibliothèques ou des programmes hébergés sur le site pypi.org.

Les commandes principales :

Par exemple pour mettre à jour des dépendances :

pip list --outdated
pip install dependance --upgrade

Attention : ces commandes doivent être lancées dans un environnement virtuel pour ne pas interférer avec les paquets installés sur le système.


Alternative : uv est un gestionnaire de paquets extrêmement rapide, par les développeurs de ruff. L'objectif est d'en faire un gestionnaire de projet complet à la Cargo.

# Create and activate a virtual environment
uv venv
source .venv/bin/activate

# Install packages from a pyproject.toml file
uv pip install -r pyproject.toml

# Generate a set of locked dependencies from a pyproject.toml file
uv pip compile pyproject.toml -o requirements.txt
# Sync a set of locked dependencies with the virtual environment from a requirements.txt file
uv pip sync requirements.txt

Gestionnaire de projet : poetry

Poetry est un outil de gestion de projet pour Python. Il permet de gérer les métadonnées d’un projet, les dépendances, l’environnement de développement, la génération de livrables, la publication, l’environnement d’exécution... Plus de détails dans la dépêche sur LinuxFr et dans la documentation.

Description des commandes principales :

Installation et mise à jour :

curl -sSL https://install.python-poetry.org | python3 -
poetry completions bash > /etc/bash_completion.d/poetry
poetry completions fish > ~/.config/fish/completions/poetry.fish

poetry self update

Sous Alpine Linux l'installation des packages suivants est un prérequis :

apk add build-base python3-dev

Création d'un nouveau projet :

poetry new project

L'arborescence suivante est créée :

project
├── pyproject.toml
├── README.md
├── project
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_project.py

Un fichier pyproject.toml est créé à la racine. Il rassemble la configuration du projet.

Création d'un nouveau projet Django :

mkdir project
cd project
poetry init --no-interaction --dependency django
poetry install
poetry run django-admin startproject config .

Ajout de dépendances :

poetry add markdown # ajoute la dernière version d'une dépendance
poetry add "arrow==1.2.3" # ajoute la version spécifiée d'une dépendance
poetry add --group dev ruff # ajoute une dépendance de développement

Le fichier pyproject.toml peut aussi être modifié manuellement. Dans ce cas il faudra ensuite installer les dépendances (poetry add fait automatiquement l'installation en plus de l'ajout dans le fichier) :

poetry check # vérifie la validité du fichier pyproject.toml
poetry install
poetry install --extras feed2toot  # installe une dépendance optionnelle

Une fois ceci fait les dépendances sont figées dans un fichier poetry.lock.

Mise à jour des dépendances :

poetry show --tree
poetry show --outdated
poetry update

Pour mettre à jour une dépendance vers une version plus récente que celle indiquée dans le fichier pyproject.toml :

poetry add flake8@latest # mise à jour vers la dernière version d'une dépendance

Il est possible d'exporter la liste des dépendances dans un fichier requirements.txt compatible avec PIP pour simplifier une installation sur un autre poste par exemple :

poetry export -f requirements.txt --output requirements.txt
pip install -r requirements.txt

Lancement d'une commande dans l'environnement virtuel du projet :

poetry run black project # lancement du formateur de code black
poetry run build-site # lancement d'une commande personnalisée

La commande personalisée peut être définie ainsi dans le fichier pyproject.toml :

[tool.poetry.scripts]
build-site = "project.site:build"

Gestion des environnements virtuels :

poetry shell # ouvre un shell dans l'environnement virtuel

poetry env use python3.10 # change d'environnement

poetry env list # liste les environnements
poetry env info # détaille les environnements
poetry env remove env_name # supprime un environnement

La configuration de Poetry est située dans le fichier .config/pypoetry/config.toml et peut être affichée avec :

poetry config --list

Pour afficher l'aide :

poetry help

Gestionnaire de projet : uv

uv est un outil de gestion de projet pour Python. Il permet de gérer les métadonnées d’un projet, les dépendances, l’environnement de développement, la génération de livrables, la publication, l’environnement d’exécution… Plus de détails dans la documentation.

De manière générale, uv gère automatiquement les environnements virtuels et les dépendances bien qu'il soit possible de les gérer manuellement avec les commandes uv venv et uv pip. uv gère également les versions de Python, en utilisant les versions installées sur le système ou en récupérant les versions sur Internet si nécessaire. Il est aussi possible de les gérer manuellement avec les commandes uv python.

Installation et gestion des versions de Python :

Exécution de scripts Python (example.py) :

Création et gestion de projets Python (pyproject.toml) :

Exécution et Installation d'outils publiés sur le Python Package Index :

Installation et mise à jour :

curl -LsSf https://astral.sh/uv/install.sh | sh
echo 'eval "$(uv generate-shell-completion bash)"' >> ~/.bashrc
echo 'uv generate-shell-completion fish | source' >> ~/.config/fish/config.fish

uv self update

Note : l'installation du package uv de la distribution peut être suffisant bien que moins à jour.

Création d'un nouveau projet :

uv init project

L'arborescence suivante est créée :

project
├── .venv
├── hello.py
├── pyproject.toml
├── README.md
└── uv.lock

Un fichier pyproject.toml qui rassemble la configuration du projet est créé à la racine. L'environnement virtuel .venv et le lockfile des dépendances uv.lock sont créés à la première exécution du projet.

Création d'un nouveau projet Django :

mkdir project
cd project
uv init
uv add django
uv run django-admin startproject config .

Ajout et suppression de dépendances :

uv add requests # ajoute la dernière version d'une dépendance
uv add 'requests==2.31.0' # ajoute la version spécifiée d'une dépendance
uv add httpx --optional group # ajoute une dépendance optionnelle
uv add pytest --group group # ajoute une dépendance de développement
uv add ruff --dev # ajoute une dépendance de développement dans le groupe dev
uv remove requests

Le fichier pyproject.toml peut aussi être modifié manuellement. Les dépendances sont ensuite synchronisées automatiquement dans l'environnement virtuel et dans le le fichier uv.lock.

Mise à jour des dépendances :

uv tree --outdated
uv add 'requests==2.32.0'

Pour mettre à jour une dépendance vers une version plus récente que celle indiquée dans le fichier pyproject.toml :

uv add 'requests>2.0.0' --upgrade-package requests
uv lock --upgrade

La liste des dépendances est figée dans le fichier uv.lock pour homogénéiser les déploiements ou les installations sur les autres postes de développement :

uv sync
uv sync --all-extras # inclus toutes les dépendances optionnelles
uv sync --extra group # inclus les dépendances optionnelles d'un groupe
uv sync --group group # inclus les dépendances de développement d'un groupe
uv sync --dev # inclus les dépendances de développement du groupe dev

Lancement d'une commande dans l'environnement virtuel du projet :

uv run hello.py # lancement d'un script
uv run ruff format # lancement d'un outil
uv run build-site # lancement d'une commande personnalisée

La commande personalisée peut être définie ainsi dans le fichier pyproject.toml :

[project.scripts]
build-site = "project.site:build"

Pendant le développement, il est possible de définir d'autres sources de dépendances pour des paquets non disponibles sur PyPI :

Note : un workspace regroupe plusieurs projets ayant des dépendances proches et un environnement virtuel commun. Les dépendances éditables sont utiles lorsque des projets ont des dépendances en conflit et des environnements virtuels distincts (voir when-not-to-use-workspaces).

Autres outils

pyinstaller

Distribuer un fichier exécutable contenant une application et toutes ses dépendances : documentation.

Astuce : sous Windows, il existe une interface graphique : auto-py-to-exe.

Création d'une application en mode console à partir d'un script python :

pyinstaller --noconfirm --onedir --console --name AppName app.py

Création d'une application graphique en ajoutant des ressources dans un répertoire data :

pyinstaller --noconfirm --onedir --windowed --add-data "/home/user/project/data:data" --name AppName /home/user/project/app.py

Création d'une application à partir d'un fichier de configuration :

pyinstaller app.spec

L'option --clean supprime le cache et les fichiers temporaires. L'option --onefile crée un fichier exécutable unique.

Astuce : pour distribuer une application Qt multiplateforme, le module fbs est tout indiqué. Mais seule la version commerciale non libre prend en charge Python 3.7 et Pyside 6. Voir aussi nuitka.

docker

docker permet de conteneuriser les serveurs (email, base de données…) sans les installer sur le système de développement. Il permet aussi de conteneuriser une application afin de la déployer en production.

ngrok

ngrok permet de rendre accessible une application web locale sur Internet en créant un tunnel sécurisé.

mailhog

mailhog permet de tester l'envoi d'emails grâce à un serveur SMTP local.

tokei

tokei permet d'afficher des statistiques sur le code d'un projet.

Emojis

Un commentaire sur un de mes articles ? Commencez une discussion sur ma liste de diffusion en envoyant un email à ~nora/public-inbox@lists.sr.ht [règles]