Python argparse: аргументы командной строки с примерами
Модуль argparse разбирает аргументы командной строки: создаёт справку --help, проверяет типы и значения по умолчанию. Достаточно создать ArgumentParser, добавить аргументы через add_argument и вызвать parse_args(). В примерах ниже список аргументов передан вручную, чтобы код можно было запускать как есть.
Минимальный пример
import argparse
parser = argparse.ArgumentParser(description="Подсчёт строк в файле")
parser.add_argument("path", help="путь к файлу")
parser.add_argument("-n", "--top", type=int, default=5, help="сколько строк показать")
parser.add_argument("-v", "--verbose", action="store_true", help="подробный вывод")
parser.add_argument("--mode", choices=["fast", "full"], default="fast")
parser.add_argument("--tags", nargs="*", default=[])
args = parser.parse_args(["data.txt", "-n", "3", "-v", "--tags", "a", "b"])
print(args.path) # data.txt
print(args.top) # 3
print(args.verbose) # True
print(args.mode) # fast
print(args.tags) # ['a', 'b']В настоящем скрипте вызывайте parser.parse_args() без аргументов: тогда данные берутся из sys.argv. Запуск выглядит так:
python count.py data.txt -n 3 -v --tags a b
python count.py --helpОсновные параметры add_argument
Параметр | Что делает |
|---|---|
| Преобразует значение в число |
| Значение, если аргумент не указан |
| Делает именованный аргумент обязательным |
| Допускает только значения из списка |
| Флаг без значения: есть |
| Любое число значений в список |
| Минимум одно значение |
| Текст в справке |
| Название значения в справке |
Подкоманды
Как у git commit и git push:
parser = argparse.ArgumentParser(prog="todo")
sub = parser.add_subparsers(dest="command", required=True)
add = sub.add_parser("add", help="добавить задачу")
add.add_argument("text")
done = sub.add_parser("done", help="отметить выполненной")
done.add_argument("number", type=int)
args = parser.parse_args(["add", "купить молоко"])
print(args.command) # add
print(args.text) # купить молоко
args = parser.parse_args(["done", "2"])
print(args.number) # 2Взаимоисключающие аргументы
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("--json", action="store_true")
group.add_argument("--csv", action="store_true")
print(parser.parse_args(["--csv"]).csv) # TrueУказание обоих флагов вызовет ошибку: argparse напечатает сообщение и завершит программу с кодом 2.
Обработка ошибок
parser = argparse.ArgumentParser()
parser.add_argument("--top", type=int)
try:
parser.parse_args(["--top", "abc"])
except SystemExit as exit_info:
print(exit_info.code) # 2При неверных аргументах argparse пишет причину в stderr и вызывает sys.exit(2). Для тестов отключите это через exit_on_error=False или перехватывайте SystemExit, как выше.
Значение по умолчанию из окружения
import os
parser = argparse.ArgumentParser()
parser.add_argument("--host", default=os.environ.get("APP_HOST", "localhost"))
print(parser.parse_args([]).host) # localhostЧастые вопросы
Чем argparse отличается от sys.argv?
sys.argv это просто список строк. argparse приводит типы, проверяет значения, создаёт справку и сообщает об ошибках.
Как сделать флаг, который включается без значения?
Используйте action="store_true". Для обратного поведения, когда флаг выключает опцию, action="store_false".
Есть ли альтернативы?
Для сложных утилит популярны click и typer. Для небольших скриптов хватает стандартного argparse.