Construction d'un outil de ligne de commande complet
Dans cette étape, nous allons combiner tout ce que nous avons appris pour construire un outil de ligne de commande complet. Créons un simple gestionnaire de tâches qui permet aux utilisateurs d'ajouter, de lister et de supprimer des tâches à l'aide d'arguments de ligne de commande.
Création du gestionnaire de tâches
- Créez un nouveau fichier nommé
task_manager.py dans le répertoire /home/labex/project
- Ajoutez le code suivant :
import argparse
import json
import os
## File to store tasks
TASKS_FILE = "/home/labex/project/tasks.json"
def load_tasks():
"""Load tasks from the JSON file."""
if os.path.exists(TASKS_FILE):
with open(TASKS_FILE, 'r') as f:
try:
return json.load(f)
except json.JSONDecodeError:
return []
return []
def save_tasks(tasks):
"""Save tasks to the JSON file."""
with open(TASKS_FILE, 'w') as f:
json.dump(tasks, f, indent=2)
def main():
## Create the main parser
parser = argparse.ArgumentParser(description='Task Manager CLI')
subparsers = parser.add_subparsers(dest='command', help='Command to run')
## Add command
add_parser = subparsers.add_parser('add', help='Add a new task')
add_parser.add_argument('title', help='Task title')
add_parser.add_argument('-p', '--priority',
choices=['low', 'medium', 'high'],
default='medium',
help='Task priority (default: medium)')
add_parser.add_argument('-d', '--due',
help='Due date (format: YYYY-MM-DD)')
## List command
list_parser = subparsers.add_parser('list', help='List all tasks')
list_parser.add_argument('-p', '--priority',
choices=['low', 'medium', 'high'],
help='Filter tasks by priority')
list_parser.add_argument('-s', '--sort',
choices=['priority', 'title'],
default='priority',
help='Sort tasks by criteria (default: priority)')
## Delete command
delete_parser = subparsers.add_parser('delete', help='Delete a task')
delete_parser.add_argument('task_id', type=int, help='Task ID to delete')
## Parse arguments
args = parser.parse_args()
## Load existing tasks
tasks = load_tasks()
## Handle commands
if args.command == 'add':
## Add a new task
new_task = {
'id': len(tasks) + 1,
'title': args.title,
'priority': args.priority,
'due': args.due
}
tasks.append(new_task)
save_tasks(tasks)
print(f"Task added: {new_task['title']} (ID: {new_task['id']})")
elif args.command == 'list':
## List tasks
if not tasks:
print("No tasks found.")
return
## Filter by priority if specified
if args.priority:
filtered_tasks = [t for t in tasks if t['priority'] == args.priority]
else:
filtered_tasks = tasks
## Sort tasks
if args.sort == 'priority':
## Custom priority sorting
priority_order = {'high': 0, 'medium': 1, 'low': 2}
sorted_tasks = sorted(filtered_tasks, key=lambda x: priority_order[x['priority']])
else:
## Sort by title
sorted_tasks = sorted(filtered_tasks, key=lambda x: x['title'])
## Display tasks
print("ID | Title | Priority | Due Date")
print("-" * 50)
for task in sorted_tasks:
due_date = task['due'] if task['due'] else 'N/A'
print(f"{task['id']:2} | {task['title'][:20]:<20} | {task['priority']:<8} | {due_date}")
elif args.command == 'delete':
## Delete a task
task_id = args.task_id
task_found = False
for i, task in enumerate(tasks):
if task['id'] == task_id:
del tasks[i]
task_found = True
break
if task_found:
save_tasks(tasks)
print(f"Task {task_id} deleted.")
else:
print(f"Task {task_id} not found.")
else:
## No command specified
parser.print_help()
if __name__ == "__main__":
main()
Comprendre le gestionnaire de tâches
Ce script démontre plusieurs fonctionnalités avancées d'argparse :
- Subparsers (Sous-analyseurs) - Création d'ensembles d'arguments spécifiques à une commande
- Arguments spécifiques à une commande - Différents arguments pour les commandes add, list et delete
- Validation imbriquée - Choix de priorité limités à des valeurs spécifiques
- Valeurs par défaut - Fournir des valeurs par défaut raisonnables pour les arguments optionnels
Tester le gestionnaire de tâches
Exécutons le script avec différentes commandes pour voir comment il fonctionne :
-
Ajout de tâches :
python3 task_manager.py add "Complete Python tutorial" -p high -d 2023-12-31
Sortie :
Task added: Complete Python tutorial (ID: 1)
Ajoutez quelques tâches supplémentaires :
python3 task_manager.py add "Read documentation" -p medium
python3 task_manager.py add "Take a break" -p low -d 2023-12-25
-
Liste des tâches :
python3 task_manager.py list
Sortie :
ID | Title | Priority | Due Date
--------------------------------------------------
1 | Complete Python tutor | high | 2023-12-31
2 | Read documentation | medium | N/A
3 | Take a break | low | 2023-12-25
-
Liste des tâches avec filtrage et tri :
python3 task_manager.py list -s title
Sortie :
ID | Title | Priority | Due Date
--------------------------------------------------
1 | Complete Python tutor | high | 2023-12-31
2 | Read documentation | medium | N/A
3 | Take a break | low | 2023-12-25
-
Filtrage par priorité :
python3 task_manager.py list -p high
Sortie :
ID | Title | Priority | Due Date
--------------------------------------------------
1 | Complete Python tutor | high | 2023-12-31
-
Suppression d'une tâche :
python3 task_manager.py delete 2
Sortie :
Task 2 deleted.
Vérifiez que la tâche a été supprimée :
python3 task_manager.py list
Sortie :
ID | Title | Priority | Due Date
--------------------------------------------------
1 | Complete Python tutor | high | 2023-12-31
3 | Take a break | low | 2023-12-25
Obtenir de l'aide pour les sous-commandes
Argparse génère automatiquement de l'aide pour chaque sous-commande :
python3 task_manager.py add --help
Sortie :
usage: task_manager.py add [-h] [-p {low,medium,high}] [-d DUE] title
positional arguments:
title Task title
options:
-h, --help show this help message and exit
-p {low,medium,high}, --priority {low,medium,high}
Task priority (default: medium)
-d DUE, --due DUE Due date (format: YYYY-MM-DD)
Points clés concernant les sous-analyseurs
- Les sous-analyseurs créent des ensembles d'arguments spécifiques à une commande
- Chaque sous-analyseur peut avoir ses propres arguments
- Le paramètre
dest spécifie où le nom de la commande sera stocké
- Les messages d'aide sont automatiquement générés pour chaque sous-commande
- Vous pouvez mélanger des arguments positionnels et optionnels dans les sous-analyseurs
Vous disposez maintenant d'un outil de ligne de commande entièrement fonctionnel qui démontre la puissance et la flexibilité d'argparse pour gérer des scénarios d'arguments complexes.