완전한 명령줄 도구 구축
이 단계에서는 지금까지 배운 모든 것을 결합하여 완전한 명령줄 도구를 구축합니다. 명령줄 인수를 사용하여 작업을 추가, 나열 및 삭제할 수 있는 간단한 작업 관리자를 만들어 보겠습니다.
작업 관리자 만들기
/home/labex/project 디렉토리에 task_manager.py라는 새 파일을 만듭니다.
- 다음 코드를 추가합니다.
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()
작업 관리자 이해
이 스크립트는 argparse 의 몇 가지 고급 기능을 보여줍니다.
- 서브 파서 (Subparsers) - 명령별 인수 집합 만들기
- 명령별 인수 (Command-specific arguments) - add, list 및 delete 명령에 대한 다른 인수
- 중첩 유효성 검사 (Nested validation) - 특정 값으로 제한된 우선 순위 선택
- 기본값 (Default values) - 선택적 인수에 대한 적절한 기본값 제공
작업 관리자 테스트
스크립트를 다양한 명령으로 실행하여 작동 방식을 확인해 보겠습니다.
- 작업 추가:
python3 task_manager.py add "Complete Python tutorial" -p high -d 2023-12-31
출력:
Task added: Complete Python tutorial (ID: 1)
몇 가지 작업을 더 추가합니다.
python3 task_manager.py add "Read documentation" -p medium
python3 task_manager.py add "Take a break" -p low -d 2023-12-25
- 작업 나열:
python3 task_manager.py list
출력:
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
- 필터링 및 정렬을 사용하여 작업 나열:
python3 task_manager.py list -s title
출력:
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
- 우선 순위별 필터링:
python3 task_manager.py list -p high
출력:
ID | Title | Priority | Due Date
--------------------------------------------------
1 | Complete Python tutor | high | 2023-12-31
- 작업 삭제:
python3 task_manager.py delete 2
출력:
Task 2 deleted.
작업이 삭제되었는지 확인합니다.
python3 task_manager.py list
출력:
ID | Title | Priority | Due Date
--------------------------------------------------
1 | Complete Python tutor | high | 2023-12-31
3 | Take a break | low | 2023-12-25
하위 명령에 대한 도움말 얻기
Argparse 는 각 하위 명령에 대한 도움말을 자동으로 생성합니다.
python3 task_manager.py add --help
출력:
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)
서브 파서에 대한 주요 사항
- 서브 파서는 명령별 인수 집합을 만듭니다.
- 각 서브 파서는 자체 인수를 가질 수 있습니다.
dest 매개변수는 명령 이름이 저장될 위치를 지정합니다.
- 각 하위 명령에 대한 도움말 메시지가 자동으로 생성됩니다.
- 서브 파서에서 위치 인수와 선택적 인수를 혼합할 수 있습니다.
이제 복잡한 인수 시나리오를 처리하기 위해 argparse 의 강력함과 유연성을 보여주는 완벽하게 작동하는 명령줄 도구가 있습니다.