Lancement de scripts en python via pipx combiné aux «inline script metadata»
La gestion des dépendances en python ou le packaging n'est pas ce
qui fait sa force, contrairement au langage Go qui permet de générer
des binaires statiques. Un méthode classique est de simplement
distribuer un script avec les dépendances associées, dans un fichier
requirements.txt
par exemple. Il y a de nombreux système de
packaging non officiels pour python:
- pip-tools qui fonctionne toujours très bien et génère
un fichier
requirements.txt
à partir d'un fichierrequirements.in
, - pipenv: un gestionnaire de paquets utilisant des fichiers de
configuration qui lui sont propres:
Pipfile
etPipfile.lock
. - poetry: le gestionnaire de paquets basé sur un fichier
pyproject.toml
. - pdm: un nouveau gestionnaire de paquets, que j'utilise désormais, qui se base sur les derniers standards de la PEP.
Mais si l'on veut simplement partager un script, et non un paquet, il est possible d'y inscrire ses dépendances via les inline script metadata, puis d'exécuter le script via pipx.
Il suffit d'écrire les dépendances dans un commentaire structuré, comme suit:
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "pyqrcode",
# ]
# ///
La première et la dernière ligne sont indispensables. Un tel script
pourra être exécuté via la commande pipx run path/to/script.py
. La
commande pipx
va créer un environnement virtuel pour ce script, y
installera les dépendances, puis l'exécutera. Pipx
peut même
récupérer un script si on lui fournit une url (ce peut être un fichier
brut sur github/gitlab/gitea/forgejo).