Когда скрипт вырастает из игрушки в инструмент, input() становится неудобным. Профессиональные CLI-программы принимают аргументы при запуске — как git commit -m "fix" или python manage.py migrate. В Python для этого есть встроенный модуль argparse.
Проблема с input()
# Неудобно: нужно запустить и ждать вопроса
python tool.py
> Введите команду: issues
> Введите репозиторий: my-repo
# Удобно: всё сразу в одной команде
python tool.py issues my-repo
python tool.py issues my-repo --state closed
Второй вариант можно вставить в cron, скрипт автоматизации или вызвать из другой программы.
Базовый синтаксис
import argparse
parser = argparse.ArgumentParser(description="Описание программы")
# Позиционный аргумент (обязательный):
parser.add_argument("repo", help="Название репозитория")
# Опциональный аргумент (с --):
parser.add_argument("--state", default="open", help="Статус issues")
args = parser.parse_args()
print(args.repo) # значение из командной строки
print(args.state) # "open" или переданное значение
Запуск:
python tool.py my-repo # args.repo = "my-repo", args.state = "open"
python tool.py my-repo --state all # args.state = "all"
Типы аргументов
# Строка (по умолчанию):
parser.add_argument("--query")
# Целое число:
parser.add_argument("--days", type=int, default=7)
# Флаг True/False:
parser.add_argument("--execute", action="store_true")
# python tool.py → args.execute = False
# python tool.py --execute → args.execute = True
# Ограниченный список значений:
parser.add_argument("--state", choices=["open", "closed", "all"], default="open")
Подкоманды (subparsers)
Для сложных CLI с несколькими командами используют подкоманды — как у git:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="command", help="Команда")
# Подкоманда "issues":
issues_p = subparsers.add_parser("issues", help="Список issues")
issues_p.add_argument("repo")
issues_p.add_argument("--state", choices=["open","closed","all"], default="open")
# Подкоманда "create":
create_p = subparsers.add_parser("create", help="Создать issue")
create_p.add_argument("repo")
create_p.add_argument("--title", required=True)
create_p.add_argument("--body", default="")
args = parser.parse_args()
if args.command == "issues":
# args.repo, args.state доступны
...
elif args.command == "create":
# args.repo, args.title, args.body доступны
...
elif args.command is None:
parser.print_help()
Запуск:
python tool.py issues my-repo
python tool.py issues my-repo --state closed
python tool.py create my-repo --title "Bug fix"
python tool.py --help # автоматически сгенерированная справка
python tool.py issues --help # справка по подкоманде
Автоматическая справка
argparse генерирует --help бесплатно:
$ python tool.py --help
usage: tool.py [-h] {issues,create,close,repos,search} ...
GitHub Automation Tool
positional arguments:
{issues,create,close,repos,search}
issues Список issues репозитория
create Создать issue
...
options:
-h, --help show this help message and exit
required=True и nargs
# Обязательный опциональный аргумент:
parser.add_argument("--title", required=True)
# Принимает несколько значений:
parser.add_argument("--labels", nargs="+") # один или больше
# python tool.py --labels bug enhancement → ["bug", "enhancement"]
Итог
argparse превращает скрипт в настоящий CLI-инструмент:
- Все параметры передаются при запуске, не через input()
- Автоматическая справка --help
- Валидация типов (type=int) и допустимых значений (choices=)
- Флаги --execute для управления поведением
- Подкоманды для группировки команд
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!