Как создать консольный скрипт с аргументами (argparse)?python-30

Модуль argparse — стандартный способ создания консольных утилит с обработкой аргументов в Python. Он предоставляет удобный интерфейс для:

  • Парсинга аргументов командной строки
  • Генерации помощи (--help)
  • Валидации входных данных
  • Создания субкоманд (как в git)

Базовый пример

import argparse

def main():
    # 1. Создаем парсер
    parser = argparse.ArgumentParser(
        description='Обработчик текстовых файлов'  # Описание скрипта
    )

    # 2. Добавляем аргументы
    parser.add_argument(
        'input_file',           # Позиционный аргумент
        help='Путь к входному файлу'  # Текст помощи
    )
    parser.add_argument(
        '-o', '--output',       # Опциональный аргумент
        required=False,         # Не обязательный
        default='output.txt',   # Значение по умолчанию
        help='Путь к выходному файлу (по умолчанию: output.txt)'
    )
    parser.add_argument(
        '-v', '--verbose',      # Флаг (без значения)
        action='store_true',    # Сохраняем True если флаг есть
        help='Вывод подробной информации'
    )

    # 3. Парсим аргументы
    args = parser.parse_args()

    # 4. Используем аргументы
    if args.verbose:
        print(f"Обработка файла {args.input_file}...")

    # Здесь основная логика скрипта
    print(f"Входной файл: {args.input_file}")
    print(f"Выходной файл: {args.output}")

if __name__ == '__main__':
    main()

Основные типы аргументов

1. Позиционные аргументы

parser.add_argument(
    'username',  # Имя аргумента
    type=str,    # Тип значения
    help='Имя пользователя'
)

2. Опциональные аргументы

parser.add_argument(
    '--count',
    type=int,
    default=1,
    help='Количество повторов (по умолчанию: 1)'
)

3. Флаги

parser.add_argument(
    '--force',
    action='store_true',  # Флаг без значения
    help='Принудительное выполнение'
)

4. Выбор из вариантов

parser.add_argument(
    '--color',
    choices=['red', 'green', 'blue'],
    help='Цвет оформления'
)

Продвинутые возможности

1. Субкоманды

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command', required=True)

# Команда 'compress'
compress_parser = subparsers.add_parser('compress', help='Сжатие файла')
compress_parser.add_argument('file', help='Файл для сжатия')

# Команда 'extract'
extract_parser = subparsers.add_parser('extract', help='Распаковка файла')
extract_parser.add_argument('archive', help='Архив для распаковки')

args = parser.parse_args()
if args.command == 'compress':
    # Логика сжатия
elif args.command == 'extract':
    # Логика распаковки

2. Группы аргументов

parser = argparse.ArgumentParser()
group = parser.add_argument_group('Настройки сети')
group.add_argument('--host', help='Хост подключения')
group.add_argument('--port', type=int, help='Порт подключения')

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

group = parser.add_mutually_exclusive_group()
group.add_argument('--json', action='store_true', help='JSON формат')
group.add_argument('--xml', action='store_true', help='XML формат')

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

try:
    args = parser.parse_args()
except argparse.ArgumentError as e:
    print(f"Ошибка аргументов: {e}")
    parser.print_help()
    sys.exit(1)
except SystemExit:
    # argparse вызывает sys.exit() при --help
    pass

Кастомизация вывода

class CustomHelpFormatter(argparse.HelpFormatter):
    def _format_action_invocation(self, action):
        # Кастомизация отображения аргументов
        if not action.option_strings:
            return action.dest.upper()
        else:
            return ', '.join(action.option_strings)

parser = argparse.ArgumentParser(
    formatter_class=CustomHelpFormatter  # Применяем кастомный форматтер
)

Резюмируем

  1. argparse — стандартный и мощный модуль для обработки аргументов
  2. Основные шаги: создание парсера, добавление аргументов, парсинг
  3. Поддерживает: позиционные/опциональные аргументы, флаги, выбор вариантов
  4. Продвинутые возможности: субкоманды, группы, кастомизация
  5. Всегда добавляйте help — это делает ваш скрипт удобнее

Лучшие практики:

  • Используйте понятные имена аргументов
  • Добавляйте описания (description, help)
  • Указывайте типы для валидации
  • Предусматривайте значения по умолчанию
  • Обрабатывайте ошибки ввода

Пример вызова скрипта:

python script.py input.txt -o result.txt --verbose