Python argparse: аргументы командной строки с примерами

Категория: Python · Язык: Python · Обновлено:

Модуль argparse разбирает аргументы командной строки: создаёт справку --help, проверяет типы и значения по умолчанию. Достаточно создать ArgumentParser, добавить аргументы через add_argument и вызвать parse_args(). В примерах ниже список аргументов передан вручную, чтобы код можно было запускать как есть.

Минимальный пример

Python
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. Запуск выглядит так:

Bash
python count.py data.txt -n 3 -v --tags a b
python count.py --help

Основные параметры add_argument

Параметр

Что делает

type=int

Преобразует значение в число

default=5

Значение, если аргумент не указан

required=True

Делает именованный аргумент обязательным

choices=[...]

Допускает только значения из списка

action="store_true"

Флаг без значения: есть True, нет False

nargs="*"

Любое число значений в список

nargs="+"

Минимум одно значение

help="..."

Текст в справке

metavar="ФАЙЛ"

Название значения в справке

Подкоманды

Как у git commit и git push:

Python
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

Взаимоисключающие аргументы

Python
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.

Обработка ошибок

Python
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, как выше.

Значение по умолчанию из окружения

Python
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.