Paramétrer un script Python avec Argparse (seconde partie)

Dans le premier article, nous avons vu comment paramétrer argparse pour récupérer les arguments de la ligne de commande. Ce premier article s’était limité à la définition d’arguments positionnels. Ceux-ci permettent de s’assurer que le script s’exécutera avec les informations indispensables.

Mais nous avons tout aussi besoin d’arguments optionnels. Ceux-ci sont utilisés pour fournir des informations non indispensables ou pour modifier ponctuellement un comportement.

C’est ce que nous allons voir dans cet article.

Cet article ne reprendra évidemment pas les bases d’argparse, même si elle sera présente dans les extraits de code. N’hésitez pas à consulter le premier article pour les bases de la configuration d’argparse avant de lire celui-ci.

Les arguments optionnels

Un argument optionnel, comme son nom l’indique, est une information non-indispensable fournie au programme par l’utilisateur. Elle n’est pas indispensable car le programme a un comportement par défaut sur cette donnée.

Passer un argument optionnel se présente sous l’une des formes suivantes :

python -m monscript -o fichier.txt
python -m monscript --output fichier.txt
python -m monscript --output=fichier.txt
python -m monscript -v
python -m monscript --verbose

Un argument optionnel peut être de la forme courte (une lettre comme dans la première et quatrième ligne) ou longue (un mot comme dans la deuxième, troisième et cinquième ligne). Dans le premier cas, il sera précédé d’un tiret et dans le second d’un double tiret.

Un argument peut aussi être suivi d’une valeur comme dans les trois premières lignes. Ou non, comme dans les deux suivantes.

Déclarer un argument optionnel

Déclarer un argument optionnel va se faire, comme pour les arguments positionnels, avec la méthode .add_argument().

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-o', '--output', help='Output file name')

args = parser.parse_args()
print(args.output)

Si vous exécutez ce fichier d’une des trois manières suivante :

python -m monscript -o essai.txt
python -m monscript --output essai.txt
python -m monscript --output=essai.txt 

Vous aurez en affichage dans le terminal la chaine de caractère essai.txt.

Le principe est donc qu’avec un nom commençant par un tirer, ArgParse considérera l’argument comme optionnel. Au parsing, ArgParse stockera la donnée fournie dans l’attribut args.output. Si l’argument n’a pas été utilisé lors de l’exécution du programme, ArgParse affectera la valeur None à l’attribut.

Vous remarquez que vous passez deux noms à la méthode .add_argument(), le nom court et le nom long. ArgParse crée un attribut avec le nom long. Vous pouvez omettre l’un ou l’autre. Si vous ne fournissez d’un nom court, ce sera évidemment le nom de l’attribut.

Mais que se passe-t-il si on ne fournit pas de donnée ? Et bien vous aurez une erreur :

? % python -m monscript -o
usage: monscript.py [-h] [-o OUTPUT]
monscript.py: error: argument -o/--output: expected one argument

Les arguments optionnels attendent donc une donnée. Mais dans certains cas, vous ne souhaitez les utiliser que comme flag. C’est le cas d’arguments comme -v ou --verbose qui indiquent simplement que vous voulez une exécution verbeuse. L’accès à l’aide fonctionne de la même manière.

L’idée est donc d’associer automatiquement un booléen à cet argument. True si l’argument (le flag) a été utilisé, False si non.

Vous comprenez que dans tous les cas, un argument (et donc l’attribut créé par .parse_args()) stock une valeur et que dans ce cas, la présence de l’argument de la ligne de commande associe une valeur prédéfinie à l’attribut.

Les arguments optionnels sont associés à une action qui indique ce qui est déclenché par la présence de l’argument. Cette action est définie par un paramètre optionnel action="store". L’exemple précédent correspond donc à :

parser.add_argument('-o', '--output',
                    action='store',
                    help='Output file name')

Plusieurs actions sont possibles. L’usage d’une paramètre optionnel comme flag où les valeurs sont des booléens étant commune, l’action à associer est la suivante :

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-v', '--verbose',
                    action='store_true')

args = parser.parse_args()
print(args.verbose)

Si vous exécutez ce programme avec et sans l’argument (et sans donnée), vous verrez que nous avons le comportement décrit ci-dessus.

Je vous ai décrit ici l’usage le plus simple de ce paramètre action et c’est de cette manière que l’on l’utilise le plus souvent. Mais la lib prévoir bien plus de cas, que vous pouvez retrouver dans la documentation.

En conclusion

Le module argparse est très riche sur les possibilités de configuration et paramétrage des arguments optionnels. Vous avez ici les bases qui doivent vous permettre de gérer les cas les plus courants qui nécessitent soit de passer une information soit de basculer un flag. Pour des usages plus fins, n’hésitez pas à consulter la documentation. Leur tuto est également très bien fait.

Quelques astuces

Grouper les argument courts

Lorsque vous voulez utiliser plusieurs arguments courts sans option, il n’est pas nécessaire de les déclarer séparément de la manière suivante :

python -m monscript -v -w -t

Vous pouvez les grouper après un tiret de la manière suivante :

python -m monscript -vwt

Répéter un argument

Imaginons qu’un argument optionnel puisse rendre votre programme verbeux. Un peu. Mais que vous souhaitiez pouvoir le rendre un peu plus verbeux en répétant l’argument. Ou très verbeux… Vous pouvez, par exemple, proposer l’exécution de la manière suivante :

python -m monscript -v
python -m monscript -vv
python -m monscript -vvv

Pour cela, nous allons utiliser une autre action :

parser.add_argument('-v', "--verbose", action="count", default=0)

L’attribut args.v ne contiendra plus un booléen mais un entier représentant le nombre d’occurrences du paramètre. Vous pourrez toujours évaluer l’état vrai/faux mais aussi récupérer le nombre de répétitions. Notez que la valeur par défaut sera None si elle n’est pas explicitement spécifiée comme ici.

Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉

À propos de... Darko Stankovski

iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.

Vous aimerez aussi...

Laisser un commentaire

En naviguant sur Dad 3.0, vous acceptez l’utilisation de cookies pour une navigation optimale et nous permettre de réaliser des statistiques de visites. Plus d'informations

Le blog Dad 3.0 utilise les cookies pour vous permettre une navigation optimale et nous permettre de réaliser des statistiques de visite. Dad 3.0 affichant des publicités, celles-si utilisent également des cookies pour un ciblage publicitaire. En continuant la navigation sur Dad 3.0, vous acceptez le dépôt et la lecture de cookies.

Fermer