Maîtrisez le module argparse de Python : Construire de meilleurs CLIs
Python est un langage de programmation puissant qui permet aux développeurs de créer une grande variété d'applications, des scripts de base aux grands systèmes logiciels. L'une des tâches de programmation les plus courantes consiste à créer des interfaces de ligne de commande (CLI), qui permettent aux utilisateurs d'interagir avec des programmes par l'intermédiaire d'un terminal ou d'une ligne de commande. Les CLI sont essentielles pour l'écriture de scripts, l'automatisation et les cas où une interface utilisateur graphique n'est pas pratique.
La gestion des paramètres de la ligne de commande est un élément important de la conception des CLI. Ces arguments permettent aux utilisateurs d'influencer le comportement d'un programme en lui fournissant des paramètres d'entrée pendant son exécution. Sans la possibilité d'évaluer ces facteurs, les programmes seraient moins polyvalents et plus difficiles à adapter à des tâches spécifiques.
Python fournit plusieurs modules pour analyser les arguments de la ligne de commande, mais le module argparse
se distingue par sa simplicité et son exhaustivité. Le module argparse
facilite le développement d'interfaces fonctionnelles en ligne de commande. Il gère automatiquement l'analyse des paramètres, affiche des instructions utiles et fournit des erreurs lorsque les utilisateurs fournissent des informations incorrectes.
Dans ce tutoriel, nous verrons comment utiliser le paquetage Python argparse
. Nous commencerons par un aperçu des interfaces de ligne de commande de Python et de l'importance de l'analyse des entrées de ligne de commande. Nous aborderons ensuite le module argparse et ses avantages.
Aperçu des interfaces de ligne de commande en Python
Les interfaces de ligne de commande sont des programmes qui fonctionnent uniquement à partir de commandes textuelles. Les utilisateurs saisissent des commandes dans un terminal ou une ligne de commande, qui comprennent généralement des arguments et des options qui modifient le comportement du programme. Les CLI sont utiles parce qu'elles sont facilement automatisées et intégrées à d'autres technologies.
En Python, une CLI est créée en développant un script qui accepte les entrées de la ligne de commande. Cette entrée est généralement présentée sous la forme d'une liste d'arguments auxquels le script peut accéder et qu'il peut interpréter. Pour les programmes de base, la gestion manuelle de ces arguments via la liste sys.argv peut suffire. Cependant, lorsque la complexité du programme augmente, le traitement manuel des arguments devient inefficace et source d'erreurs.
Importance de l'analyse des arguments de la ligne de commande
L'analyse des arguments de la ligne de commande est nécessaire pour de nombreuses raisons :
- Flexibilité: En prenant des paramètres, un programme peut effectuer plusieurs tâches ou agir sur différents ensembles de données sans modifier le code. Les utilisateurs peuvent spécifier les fichiers à traiter, configurer les paramètres et sélectionner les modes de fonctionnement.
- Convivialité: L'analyse correcte des arguments permet au programme d'afficher des messages utiles, d'indiquer à l'utilisateur comment utiliser le programme et de gérer les erreurs de manière élégante.
- Maintenabilité: L'utilisation d'un module d'analyse dédié, tel que argparse, rend votre code plus clair et plus facile à maintenir. Il sépare la logique utilisée pour analyser les arguments de l'opération principale du programme.
Introduction au module argparse et à ses avantages
Le module argparse
fait partie de la bibliothèque standard de Python. Il peut donc être utilisé sans installer de paquetage supplémentaire. Il offre une interface simple et cohérente pour analyser les entrées de la ligne de commande. Voici quelques-uns des avantages de l'utilisation de argparse
:
- Génération automatique d'aide: Il génère des messages d'aide et d'utilisation basés sur les arguments du code.
- Gestion des erreurs: Il affiche des messages d'erreur utiles lorsque les utilisateurs saisissent des arguments non valides.
- Conversion de type: Il peut convertir automatiquement les chaînes de paramètres dans le type de données approprié.
- Il prend en charge les arguments positionnels nécessaires et les arguments facultatifs avec simplicité.
- Valeurs par défaut: Il vous permet de fournir des valeurs par défaut pour les paramètres que l'utilisateur ne fournit pas.
argparse permet aux développeurs de se concentrer sur les fonctionnalités principales de leur programme tout en s'appuyant sur une base solide pour la gestion des entrées en ligne de commande.
Configuration de argparse et utilisation de base
Maintenant que nous avons abordé l'importance de l'analyse des arguments de la ligne de commande et les avantages de l'utilisation de argparse
, voyons comment la configurer et l'utiliser dans un script Python.
Installation et importation de argparse
Il n'est pas nécessaire d'installer quoi que ce soit séparément car argparse
fait partie de la bibliothèque standard de Python. Vous pouvez l'importer dès le début de votre script.
import argparse
Cette ligne charge le module argparse
dans votre script, ce qui vous permet d'utiliser sa fonctionnalité d'analyse des arguments de la ligne de commande.
Création d'un analyseur d'arguments simple
La première étape de l'utilisation de argparse
consiste à générer un objet d'analyseur. Cet objet stocke des informations sur les arguments acceptés par votre programme et analyse les entrées de la ligne de commande.
parser = argparse.ArgumentParser(description='Process some integers.')
Dans cet exemple, nous créons un objet ArgumentParser()
et décrivons le programme. Lorsque l'utilisateur sélectionne l'option d'aide (-h
ou --help
), cette description s'affiche.
Ajout d'arguments positionnels et optionnels
Maintenant que nous avons développé l'analyseur, nous pouvons spécifier les arguments que notre programme acceptera.
Ajouter des arguments de position
Les arguments de position sont essentiels et doivent être présentés dans un ordre précis. Prenons l'exemple d'un script qui additionne deux nombres. Nous pouvons définir deux arguments de position pour les nombres :
parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')
Dans ce code, num1
et num2
font référence aux paramètres de position.
type=int
indique que les paramètres doivent être convertis en nombres entiers. L'argument help spécifie une description qui apparaîtra dans le message d'aide.
Ajouter des arguments facultatifs
Les arguments facultatifs ne sont pas nécessaires et fournissent généralement des options supplémentaires ou modifient le comportement du programme. Ils sont généralement précédés d'un ou deux tirets. Nous ajouterons un argument facultatif pour activer la sortie verbale :
parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')
Ici :
- L'option courte est
-v
(par exemple,-v
).--verbose
est une option longue. action='store_true'
indique que si l'option est sélectionnée, l'attribut verbose aura la valeurTrue
; sinon, il aura la valeurFalse
.- L'argument
help
spécifie une description pour le message d'aide.
Analyse des arguments et accès à leurs valeurs
Après avoir spécifié tous les arguments, nous devons analyser l'entrée de la ligne de commande. Pour ce faire, utilisez la méthode .parse_args()
.
args = parser.parse_args()
Les paramètres analysés sont maintenant stockés dans la variable args
en tant qu'attributs. Nous pouvons y accéder en utilisant la notation par points.
result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
print('Verbose mode is enabled.')
Voici donc un script complet qui ajoute deux nombres et inclut un mode verbeux optionnel :
import argparse
parser = argparse.ArgumentParser(description='Add two integers.')
parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')
parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')
args = parser.parse_args()
result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
print('Calculation completed successfully.')
Vous pouvez exécuter ce script à partir de la ligne de commande et fournir les arguments de position requis :
python add_numbers.py 3 5
The sum of 3 and 5 is 8
Si vous incluez l'option -v
ou --verbose
, le script affichera un message verbeux supplémentaire :
python add_numbers.py 3 5 --verbose
The sum of 3 and 5 is 8
Calculation completed successfully.
Si l'utilisateur exécute le script avec l'option -h
ou --help
, argparse
affichera un message d'aide généré automatiquement :
python add_numbers.py -h
usage: add_numbers.py [-h] [-v] num1 num2
Add two integers.
positional arguments:
num1 The first number to add.
num2 The second number to add.
optional arguments:
-h, --help show this help message and exit
-v, --verbose Increase output verbosity.
Cette fonction rend votre programme plus convivial en fournissant des instructions claires sur la manière de l'utiliser.
Traitement avancé des arguments
Lorsque vous développez des programmes en ligne de commande en Python, vous pouvez rencontrer des scénarios nécessitant une analyse plus complexe des arguments. Le module argparse
de Python comprend plusieurs fonctionnalités pour répondre à ces exigences complexes, ce qui vous permet de développer des interfaces flexibles et conviviales.
Utilisation de nargs pour des arguments multiples
Dans certains cas, votre application doit accepter plusieurs valeurs pour le même argument. Par exemple, supposons que vous souhaitiez créer un script qui traite plusieurs fichiers à la fois. Le paramètre nargs de argparse
vous permet de spécifier le nombre d'arguments de la ligne de commande à lire.
Voici comment utiliser nargs
pour accepter plusieurs noms de fichiers :
import argparse
parser = argparse.ArgumentParser(description='Process multiple files.')
parser.add_argument('filenames', nargs='+', help='List of files to process.')
args = parser.parse_args()
for filename in args.filenames:
print(f'Processing file: {filename}')
# Add your file processing code here
Dans ce cas, nargs='+'
indique à l'analyseur qu'il doit s'attendre à ce qu'un ou plusieurs arguments figurent dans les noms de fichiers. L'utilisateur peut fournir autant de noms de fichiers que nécessaire, et ils seront enregistrés dans une liste appelée args.filenames
.
Si vous souhaitez accepter un certain nombre d'arguments, fixez la valeur de nargs
à ce nombre. Par exemple, nargs=2
requiert exactement deux paramètres.
Mise en œuvre de choix pour limiter les valeurs des arguments
Parfois, vous souhaitez limiter un argument à une plage de valeurs valides spécifiée. Cela garantit que l'utilisateur fournit des données valables, ce qui permet d'éviter les erreurs ou les actions inattendues. Le paramètre options vous permet de spécifier les valeurs autorisées pour un argument.
Considérons un script qui exécute plusieurs activités en fonction d'un mode sélectionné par l'utilisateur.
import argparse
parser = argparse.ArgumentParser(description='Perform actions in different modes.')
parser.add_argument('--mode', choices=['backup', 'restore', 'delete'], required=True, help='Mode of operation.')
args = parser.parse_args()
if args.mode == 'backup':
print('Backing up data...')
# Backup code here
elif args.mode == 'restore':
print('Restoring data...')
# Restore code here
elif args.mode == 'delete':
print('Deleting data...')
# Delete code here
Dans ce script, l'argument --mode
doit être l'une des options. Si l'utilisateur saisit une valeur qui ne figure pas dans la liste, argparse
renvoie un message d'erreur.
Gestion des drapeaux booléens et des bascules
Les indicateurs booléens sont des choix qui permettent d'activer ou de désactiver des fonctionnalités spécifiques dans votre application. Ils sont généralement définis sans valeur, simplement en incluant l'indicateur dans la commande. Vous pouvez gérer ces drapeaux dans argparse
avec le paramètre action
.
Par exemple, incluons un mode de débogage dans un script :
import argparse
parser = argparse.ArgumentParser(description='A script with debug mode.')
parser.add_argument('--debug', action='store_true', help='Enable debug output.')
args = parser.parse_args()
if args.debug:
print('Debug mode is enabled.')
# Additional debug information here
else:
print('Debug mode is disabled.')
En utilisant action='store_true'
, l'indicateur --debug
définira args.debug
à True
s'il est présent et False
dans le cas contraire.
Définition des valeurs par défaut et des arguments requis
Les arguments facultatifs comprennent souvent des valeurs par défaut raisonnables. Cela signifie que si l'utilisateur ne spécifie pas l'argument, l'application utilisera la valeur par défaut. L'argument default
vous permet de spécifier une valeur par défaut.
En voici un exemple :
import argparse
parser = argparse.ArgumentParser(description='Adjust program settings.')
parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')
Dans ce scénario, si l'utilisateur n'indique pas --timeout
, la valeur par défaut est de 30 secondes.
Pour rendre un argument facultatif obligatoire, set required=True
.
import argparse
parser = argparse.ArgumentParser(description='Send a message.')
parser.add_argument('--recipient', required=True, help='Recipient of the message.')
args = parser.parse_args()
print(f'Sending message to {args.recipient}.')
Le script requiert désormais l'argument --recipient
.
Personnalisation des messages d'aide et d'erreur
Fournir des messages clairs et utiles aux utilisateurs est un élément essentiel du développement d'un programme de ligne de commande efficace. Le module Python argparse
crée automatiquement des messages d'aide, mais vous pouvez modifier ces messages pour mieux les adapter à vos besoins.
Générer des messages d'aide automatiques
Par défaut, argparse
génère un message d'aide, auquel vous pouvez accéder en utilisant les options -h
ou --help
. Ce message contient l'utilisation du programme, une description et des informations sur chaque argument.
Par exemple :
import argparse
parser = argparse.ArgumentParser(description='Calculate factorial of a number.')
parser.add_argument('number', type=int, help='The number to calculate the factorial for.')
args = parser.parse_args()
Lorsqu'un utilisateur exécute le script à l'aide de -h
, il verra :
usage: script.py [-h] number
Calculate factorial of a number.
positional arguments:
number The number to calculate the factorial for.
optional arguments:
-h, --help show this help message and exit
Ce message d'aide automatique fournit des informations utiles sans nécessiter d'effort supplémentaire.
Personnalisation des descriptions d'aide et des messages d'utilisation
Bien que les messages d'aide par défaut soient utiles, vous pouvez les modifier pour fournir des informations supplémentaires ou pour les adapter à une structure spécifique. Vous pouvez modifier la description, l'épilogue et le texte d'utilisation sur le site ArgumentParser
.
Par exemple, pour inclure un épilogue et personnaliser le message d'utilisation :
import argparse
parser = argparse.ArgumentParser(
description='Convert temperatures between Celsius and Fahrenheit.',
epilog='Enjoy using the temperature converter!',
usage='%(prog)s [options] temperature')
parser.add_argument('temperature', type=float, help='Temperature value to convert.')
parser.add_argument('--to-fahrenheit', action='store_true', help='Convert Celsius to Fahrenheit.')
parser.add_argument('--to-celsius', action='store_true', help='Convert Fahrenheit to Celsius.')
args = parser.parse_args()
Désormais, lorsque l'utilisateur consultera le message d'aide, celui-ci inclura la description personnalisée, l'utilisation et l'épilogue :
python file.py --help
usage: p.py [options] temperature
Convert temperatures between Celsius and Fahrenheit.
positional arguments:
temperature Temperature value to convert.
options:
-h, --help show this help message and exit
--to-fahrenheit Convert Celsius to Fahrenheit.
--to-celsius Convert Fahrenheit to Celsius.
Gestion du traitement des erreurs et du retour d'information de l'utilisateur
Si un utilisateur entre des arguments non valides, argparse
affichera un message d'erreur et quittera le programme. Vous pouvez modifier ce comportement pour fournir un retour d'information plus utile ou pour gérer les échecs différemment.
Une approche consiste à surcharger la méthode d'erreur dans une sous-classe de ArgumentParser
:
import argparse
import sys
class CustomArgumentParser(argparse.ArgumentParser):
def error(self, message):
print(f'Error: {message}')
self.print_help()
sys.exit(2)
parser = CustomArgumentParser(description='Divide two numbers.')
parser.add_argument('numerator', type=float, help='The numerator.')
parser.add_argument('denominator', type=float, help='The denominator.')
args = parser.parse_args()
if args.denominator == 0:
parser.error('Denominator cannot be zero.')
result = args.numerator / args.denominator
print(f'Result: {result}')
Si l'utilisateur tente de diviser par zéro dans ce script, l'application affiche un avertissement d'erreur et un texte d'aide, invitant l'utilisateur à fournir des données valides.
Python file.py 6 0
Error: Denominator cannot be zero.
usage: file.py [-h] numerator denominator
Divide two numbers.
positional arguments:
numerator The numerator.
denominator The denominator.
options:
-h, --help show this help message and exit
Vous pouvez également inclure une gestion personnalisée des erreurs dans votre script. Par exemple, pour gérer les chemins d'accès aux fichiers non valides :
import argparse
import os
parser = argparse.ArgumentParser(description='Read a file and display its contents.')
parser.add_argument('filepath', help='Path to the file.')
args = parser.parse_args()
if not os.path.exists(args.filepath):
parser.error(f"The file {args.filepath} does not exist.")
with open(args.filepath, 'r') as file:
contents = file.read()
print(contents)
Si vous exécutez le script avec un chemin d'accès non valide, vous obtiendrez l'erreur suivante :
python app..py file
usage: p.py [-h] filepath
app.py: error: The file file does not exist.
Exemples concrets et cas d'utilisation
Comprendre comment utiliser le module argparse
dans le monde réel rendra sa fonctionnalité plus claire. Examinons quelques exemples d'utilisation de argparse
dans des applications réelles.
Construire une calculatrice en ligne de commande
Supposons que vous deviez développer une calculatrice simple capable d'effectuer des opérations arithmétiques de base à partir de la ligne de commande. Cette calculatrice doit accepter deux nombres et un opérateur pour exécuter le calcul demandé.
Voici comment aborder cette tâche :
import argparse
parser = argparse.ArgumentParser(description='Simple command-line calculator.')
parser.add_argument('num1', type=float, help='First number.')
parser.add_argument('operator', choices=['+', '-', '*', '/'], help='Operation to perform.')
parser.add_argument('num2', type=float, help='Second number.')
args = parser.parse_args()
if args.operator == '+':
result = args.num1 + args.num2
elif args.operator == '-':
result = args.num1 - args.num2
elif args.operator == '*':
result = args.num1 * args.num2
elif args.operator == '/':
if args.num2 == 0:
print('Error: Division by zero is not allowed.')
exit(1)
result = args.num1 / args.num2
print(f'The result is: {result}')
Dans ce script, le module argparse
est utilisé pour définir trois arguments positionnels : deux nombres et un opérateur. L'argument choices
limite l'opérateur aux symboles arithmétiques valides. Lorsque l'utilisateur exécute le script, il peut effectuer ces calculs :
python calculator.py 10 + 5
The result is: 15.0
Cette calculatrice de base montre comment les options de la ligne de commande peuvent améliorer la flexibilité et l'interactivité d'un programme.
Création d'un script de traitement de fichiers avec plusieurs options
Supposons que vous ayez besoin d'un script qui traite des fichiers texte et propose des options telles que la désignation d'un fichier de sortie, la sélection d'un mode de traitement et l'activation d'une sortie verbeuse.
Voici un exemple de la façon dont vous pourriez le mettre en place :
import argparse
parser = argparse.ArgumentParser(description='Process text files.')
parser.add_argument('input_file', help='Path to the input file.')
parser.add_argument('-o', '--output', help='Path to the output file.')
parser.add_argument('-m', '--mode', choices=['uppercase', 'lowercase'], default='uppercase', help='Processing mode.')
parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output.')
args = parser.parse_args()
# Read the input file
with open(args.input_file, 'r') as file:
content = file.read()
if args.verbose:
print(f'Reading from {args.input_file}')
# Process the content
if args.mode == 'uppercase':
processed_content = content.upper()
else:
processed_content = content.lower()
if args.verbose:
print('Processing content')
# Write to the output file or print to console
if args.output:
with open(args.output, 'w') as file:
file.write(processed_content)
if args.verbose:
print(f'Writing output to {args.output}')
else:
print(processed_content)
Ce script accepte un fichier d'entrée et dispose d'options pour le fichier de sortie, le mode de traitement et la sortie verbeuse. Les utilisateurs peuvent modifier le comportement du script sans modifier le code.
python text_processor.py input.txt -o output.txt --mode lowercase -v
Reading from input.txt
Processing content
Writing output to output.txt
Développer un outil CLI avec des sous-commandes
Dans les applications plus complexes, des sous-commandes peuvent être nécessaires, de la même manière que git utilise des commandes telles que git commit et git push. Le module argparse
fournit des sous-parcelles à cette fin.
Voici comment créer un outil CLI avec des sous-commandes :
import argparse
parser = argparse.ArgumentParser(description='Manage tasks.')
subparsers = parser.add_subparsers(dest='command', required=True)
# Subcommand 'add'
parser_add = subparsers.add_parser('add', help='Add a new task.')
parser_add.add_argument('name', help='Name of the task.')
parser_add.add_argument('-p', '--priority', type=int, choices=range(1, 6), default=3, help='Priority of the task.')
# Subcommand 'list'
parser_list = subparsers.add_parser('list', help='List all tasks.')
parser_list.add_argument('-a', '--all', action='store_true', help='List all tasks, including completed ones.')
# Subcommand 'complete'
parser_complete = subparsers.add_parser('complete', help='Mark a task as completed.')
parser_complete.add_argument('task_id', type=int, help='ID of the task to complete.')
args = parser.parse_args()
if args.command == 'add':
print(f"Adding task '{args.name}' with priority {args.priority}")
# Code to add the task
elif args.command == 'list':
print('Listing tasks')
if args.all:
print('Including completed tasks')
# Code to list tasks
elif args.command == 'complete':
print(f'Marking task {args.task_id} as completed')
# Code to complete the task
Dans cet exemple, le script comporte trois sous-commandes : add
, list
, et complete
. Chaque sous-commande a ses arguments. Lorsque les utilisateurs exécutent le script, ils saisissent la sous-commande et les autres paramètres éventuels.
Par exemple :
python task_manager.py add "Write report" -p 2
Adding task 'Write report' with priority 2
Tâches d'inscription
python task_manager.py list
Listing tasks
Marquer les tâches comme terminées :
python task_manager.py complete 3
Marking task 3 as completed
subparsers
vous permettent de créer des outils de ligne de commande complexes qui sont bien organisés et faciles à étendre, ce qui vous permet de créer des applications capables de faire plusieurs choses dans une seule interface.
Meilleures pratiques et conseils pour Python argparse
Le développement de programmes en ligne de commande ne se limite pas à l'écriture d'un code qui fonctionne. Il s'agit également d'écrire un code propre, facile à maintenir et à utiliser.
Voici quelques bonnes pratiques pour travailler avec le module argparse
.
Organiser le code pour en faciliter la lecture et la maintenance
Lorsque vos scripts deviennent plus complexes, il est essentiel d'organiser votre code pour en faciliter la compréhension et la maintenance. Pour ce faire, vous pouvez utiliser des fonctions et des classes pour organiser des sections distinctes de votre code.
La décomposition de votre programme en morceaux plus petits et réutilisables facilite sa gestion et élimine la duplication du code.
Par exemple, dans un script de gestion des tâches, vous pouvez définir différentes fonctions pour l'ajout de tâches, l'établissement de listes de tâches et l'achèvement de tâches. Cette division vous permet de vous concentrer sur un aspect de la logique à la fois, ce qui rend votre code plus clair.
Une autre technique efficace consiste à séparer la logique d'analyse des arguments du reste de votre code. En plaçant toutes les définitions d'arguments et l'analyse syntaxique au début de votre script, ou dans une fonction dédiée, il est plus facile pour les autres de comprendre comment votre programme gère les entrées.
L'utilisation de noms de variables appropriés améliore également la lisibilité. Choisissez des noms de variables qui reflètent leur fonction, afin que toute personne qui consulte votre code puisse comprendre ce qui se passe. L'ajout de commentaires et de docstrings
pour expliquer ce que font vos fonctions et tous les détails clés peut contribuer à améliorer la compréhension.
Test et débogage des applications en ligne de commande
Le test de vos applications est essentiel pour garantir leur bon fonctionnement et détecter rapidement les défaillances. L'écriture de tests unitaires avec des frameworks de test Python tels que unittest
ou pytest
est une excellente approche pour tester votre code. Ces tests vous permettent d'imiter différentes entrées et de vous assurer que vos fonctions fonctionnent correctement.
Par exemple, vous pouvez tester plusieurs scénarios en simulant les entrées de la ligne de commande plutôt qu'en exécutant le script à partir de la ligne de commande. Cette stratégie vous permet de vous assurer que l'analyse des arguments fonctionne comme prévu et que votre application gère correctement les différents scénarios.
Il est également essentiel de gérer les exceptions avec élégance. En utilisant les blocs try-except
, vous pouvez détecter les erreurs et envoyer des messages utiles à l'utilisateur. Cela rend votre application plus stable et plus conviviale.
Pensez également à inclure un drapeau de débogage dans votre script. Ce drapeau peut activer une sortie supplémentaire qui vous permet de suivre l'exécution du programme en cas de problème. Cette option facilite le diagnostic des problèmes tout au long du développement et de la maintenance.
Comparaison de argparse avec d'autres bibliothèques d'analyse d'arguments
Bien que argparse
soit un utilitaire précieux dans la bibliothèque standard de Python, il existe des bibliothèques supplémentaires qui fournissent des méthodes alternatives pour analyser les arguments de la ligne de commande. La compréhension de ces options vous aidera à choisir l'outil adéquat pour votre projet.
L'une de ces bibliothèques est Click. Click est un paquetage tiers permettant de créer des interfaces en ligne de commande à l'aide de décorateurs. Il possède une syntaxe plus intuitive et est idéal pour les applications sophistiquées. Par exemple, vous pouvez utiliser des décorateurs Python pour créer des commandes et des options, ce qui rend votre code plus compact et plus compréhensible.
Docopt est une autre option qui vous permet de définir votre interface en ligne de commande à l'aide de la docstring du programme. Docopt analyse automatiquement le message d'aide et construit l'analyseur d'arguments lorsque les instructions d'utilisation sont incluses dans la chaîne de documentation. Cette approche est élégante et convient aux scripts simples qui nécessitent une spécification plus lisible par l'homme.
Lorsque vous choisissez la bibliothèque à laquelle vous allez faire appel, pensez aux exigences de votre projet. Si vous souhaitez éliminer les dépendances externes et que vous voulez un outil capable de gérer la plupart des circonstances, argparse est une excellente solution. Si vous souhaitez une syntaxe plus intuitive et que vous travaillez sur une application complexe, Click pourrait être mieux adapté. Docopt est un bon choix pour les petits programmes avec des interfaces simples.
Conclusion
Tout au long de cet article, nous avons vu comment utiliser le module Python argparse
pour développer des programmes en ligne de commande en Python. En travaillant sur des exemples concrets, nous avons appris à créer des scripts réalistes qui reçoivent des données de l'utilisateur et accomplissent des tâches pertinentes.
De la conception d'une calculatrice de base au développement d'un outil de gestion des tâches avec des sous-commandes, le module argparse
offre la polyvalence nécessaire pour faire face à un large éventail de circonstances. Vous pouvez concevoir des applications fiables et simples à maintenir en adhérant aux meilleures pratiques telles que l'organisation du code, les tests complets et la prise en compte de bibliothèques alternatives.
Que vous souhaitiez automatiser des activités, analyser des données ou créer des outils complexes, la compréhension de l'analyse des arguments de la ligne de commande améliore votre capacité à concevoir des programmes Python efficaces. Coulez vos connaissances en Python dès aujourd'hui grâce à notre parcours de compétences sur les principes fondamentaux de Python.
FAQ Python argparse
Comment rendre un argument optionnel obligatoire dans argparse ?
Les arguments optionnels dans argparse ne sont généralement pas nécessaires car ils sont, par définition, optionnels. Toutefois, il peut arriver que vous souhaitiez qu'un argument commençant par -- soit obligatoire. Pour ce faire, définissez le paramètre requis à True
lorsque vous ajoutez l'argument.
Voici comment vous pouvez y parvenir :
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', required=True, help='Path to the input file.')
args = parser.parse_args()
print(f'Input file: {args.input}')
Comment gérer les arguments mutuellement exclusifs avec argparse ?
Il peut arriver que vous rencontriez des arguments qui ne doivent pas être utilisés ensemble. Par exemple, un script peut prendre soit --verbosesoit --quiet, mais pas les deux à la fois. Pour faire face à ce scénario, argparse prend en charge la définition de groupes mutuellement exclusifs.
Voici comment procéder :
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='Enable verbose output.')
group.add_argument('--quiet', action='store_true', help='Enable quiet mode.')
args = parser.parse_args()
if args.verbose:
print('Verbose mode is on.')
elif args.quiet:
print('Quiet mode is on.')
else:
print('Default mode is on.')
Ce script permet à l'utilisateur d'activer le modeverbeux ou le modesilencieux de, mais pas les deux. S'ils tentent d'utiliser les deux options simultanément, lesite argparse émettra une erreur.
Comment utiliser argparse pour lire les arguments d'un fichier au lieu de la ligne de commande ?
Bien que argparse soit destiné à l'analyse des arguments de la ligne de commande, vous pouvez vouloir les lire à partir d'un fichier. Vous pouvez le faire en lisant les arguments du fichier et en les donnant à la méthode parse_args()
via le paramètreargs.
En voici un exemple.
import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', help='Path to the input file.')
parser.add_argument('--output', help='Path to the output file.')
# Read arguments from a file
with open('args.txt', 'r') as file:
file_args = file.read().split()
args = parser.parse_args(file_args)
print(f'Input file: {args.input}')
print(f'Output file: {args.output}')
Dans ce cas, le fichier args.txt pourrait contenir :
--input data/input.txt --output data/output.txt
Le script lit les paramètres du fichier, les convertit en une liste, puis les donne à parse_args(). Cela vous permet de gérer vos arguments dans un fichier plutôt que de les saisir à chaque fois.
Comment personnaliser le message d'aide de argparse pour qu'il affiche les valeurs par défaut ?
Par défaut, argparse n'affiche pas les valeurs par défaut des paramètres dans le message d'aide. Si vous souhaitez inclure des valeurs par défaut dans le texte d'aide, modifiez le paramètre d'aide ou utilisez la commande ArgumentDefaultsHelpFormatter.
Voici comment ajouter des valeurs par défaut au message d'aide :
import argparse
parser = argparse.ArgumentParser(
description='Process some data.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--timeout', type=int, default=60, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')
Avec le format ArgumentDefaultsHelpFormatter, le message d'aide affichera la valeur par défaut de l'argument --timeout :
usage: script.py [-h] [--timeout TIMEOUT]
Process some data.
optional arguments:
-h, --help show this help message and exit
--timeout TIMEOUT Timeout in seconds. (default: 60)
Cela permet aux utilisateurs d'obtenir plus d'informations sur les paramètres par défaut de votre programme.
Quelles sont les meilleures pratiques pour tester les applications en ligne de commande qui utilisent argparse ?
Tester des applications en ligne de commande peut s'avérer difficile, mais il existe des méthodes pour faciliter les choses. Un moyen utile consiste à reproduire les arguments de la ligne de commande à l'aide du moduleunittest de .
Voici un exemple de test d'un script à l'aide de argparse:
import unittest
import argparse
import sys
def create_parser():
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--number', type=int, help='A number.')
return parser
def main(args):
parser = create_parser()
parsed_args = parser.parse_args(args)
if parsed_args.number is None:
parser.error('No number provided.')
result = parsed_args.number * 2
return result
class TestMain(unittest.TestCase):
def test_main_with_number(self):
test_args = ['--number', '5']
result = main(test_args)
self.assertEqual(result, 10)
def test_main_without_number(self):
test_args = []
with self.assertRaises(SystemExit):
main(test_args)
if __name__ == '__main__':
unittest.main()
Dans le script de test :
- La fonction .create_parser() initialise l'analyseur d'arguments.
- La méthode main() traite les arguments et exécute la logique principale.
- Le TestMain propose des méthodes de test pour simuler différentes entrées de ligne de commande.
- Les tests permettent de s'assurer que le programme réagit comme prévu à diverses entrées.
Structurez votre code de manière à séparer le traitement des arguments et la logique primaire, afin de faciliter le test des différentes parties de votre programme.
blog
Les 32 meilleures questions d'entretien sur AWS et leurs réponses pour 2024
blog
2022-2023 Rapport annuel DataCamp Classrooms
blog
Q2 2023 DataCamp Donates Digest
blog
Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Nisha Arya Ahmed
20 min
blog
Célébration de Saghar Hazinyar : Une boursière de DataCamp Donates et une diplômée de Code to Inspire

Fereshteh Forough
4 min
blog