ArgumentParser.parse args: примеры (PYTHON)

Использование ArgumentParser.parse_args для анализа параметров командной строки в Python
Раздел: Аргументы командной строки, Парсинг
ArgumentParser.parse_args(args: list = None, namespace: Namespace = None): Namespace

Описание функции parse_args

Метод parse_args() принадлежит классу argparse.ArgumentParser. Эта функция выполняет анализ аргументов командной строки, которые передаются скрипту Python. Применение функции актуально при необходимости создания программ с интерфейсом командной строки, где требуется гибкая обработка параметров, флагов и аргументов.

Использование функции предполагает предварительное конфигурирование парсера с помощью методов add_argument(). Функция parse_args() считывает аргументы из sys.argv, однако может принимать и произвольный список строк.

Аргументы метода

  • args (опционально): Список строк для анализа. По умолчанию используется sys.argv[1:].
  • namespace (опционально): Объект, в который будут помещены атрибуты. По умолчанию создается новый объект Namespace.

Возвращаемое значение

Функция возвращает объект Namespace, содержащий атрибуты, соответствующие добавленным аргументам. При использовании подкоманд возвращается также объект Namespace, но структура может быть вложенной.

Базовые примеры применения

Пример с обязательными позиционными аргументами:

import argparse
parser = argparse.ArgumentParser(description='Складывает два числа.')
parser.add_argument('x', type=int, help='первое слагаемое')
parser.add_argument('y', type=int, help='второе слагаемое')
args = parser.parse_args(['5', '3'])
print(f'Результат: {args.x + args.y}')
Результат: 8

Пример с необязательными именованными аргументами и флагами:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--name', default='мир', help='имя для приветствия')
parser.add_argument('--verbose', '-v', action='store_true', help='подробный вывод')
args = parser.parse_args(['--name', 'Пользователь', '-v'])
if args.verbose:
    print(f'Программа запущена. Привет, {args.name}!')
else:
    print(f'Привет, {args.name}!')
Программа запущена. Привет, Пользователь!

Похожие инструменты в Python

В стандартной библиотеке Python также присутствует модуль getopt, который предоставляет более низкоуровневый интерфейс, похожий на функцию C getopt(). Он менее удобен для сложных сценариев, но может быть полезен для простого анализа.

Сторонние библиотеки, такие как click и docopt, предлагают альтернативные декларативные подходы. Click использует декораторы для определения параметров, что делает код более компактным для создания CLI-приложений. Docopt позволяет описывать интерфейс в строке документации.

Выбор инструмента зависит от сложности задачи. Argparse является стандартным и наиболее универсальным решением. Click удобен для быстрого создания приложений с множеством команд. Getopt подходит для очень простых случаев или при необходимости совместимости со старым кодом.

Аналоги в других языках программирования

В JavaScript (Node.js) для аналогичных целей используют модуль yargs или встроенный process.argv. Yargs предоставляет богатый API для парсинга.

// yargs пример
const yargs = require('yargs');
const argv = yargs.option('name', {
    alias: 'n',
    describe: 'Имя для приветствия',
    default: 'мир'
}).argv;
console.log(`Привет, ${argv.name}!`);
$ node script.js --name Иван
Привет, Иван!

В Java популярны библиотеки Apache Commons CLI и JCommander. Они требуют большего объема кода для настройки по сравнению с argparse.

В Go парсинг аргументов осуществляется через пакет flag из стандартной библиотеки. Его синтаксис отличается, но идеология схожа.

// Go пример
package main
import (
    "flag"
    "fmt"
)
func main() {
    name := flag.String("name", "мир", "имя для приветствия")
    flag.Parse()
    fmt.Printf("Привет, %s!\n", *name)
}
$ go run script.go -name Иван
Привет, Иван!

В PHP для анализа аргументов CLI-скриптов используется глобальный массив $argv и функции типа getopt(). В C# распространена библиотека CommandLineParser. В Lua часто применяются простые самописные парсеры или библиотеки like argparse (вдохновленная Python).

Распространенные ошибки

Одна из частых ошибок - конфликт имен аргументов при использовании префиксов.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--data')
parser.add_argument('--data-file')  # Может возникнуть конфликт преобразования в имя атрибута
args = parser.parse_args(['--data', 'value1', '--data-file', 'file.txt'])
print(args.data_file)  # Ожидается 'file.txt'
file.txt

Ошибка возникает при неправильном указании типа аргумента.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('number', type=int)
try:
    args = parser.parse_args(['не_число'])
except SystemExit:
    print("Ошибка: неверный тип аргумента.")
usage: script.py [-h] number
script.py: error: argument number: invalid int value: 'не_число'

Проблемы могут появиться при смешивании позиционных и опциональных аргументов, если не соблюдается порядок.

Изменения в новых версиях Python

В Python 3.7 была добавлена поддержка описания текста справки с помощью параметра description в add_argument(). В Python 3.9 появилось улучшенное отображение ошибок для подкоманд. В Python 3.10 были добавлены новые действия, такие как BooleanOptionalAction, позволяющее использовать флаги вида --flag и --no-flag одновременно.

Например, использование BooleanOptionalAction:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', action=argparse.BooleanOptionalAction)
args = parser.parse_args(['--verbose'])  # args.verbose будет True
args2 = parser.parse_args(['--no-verbose'])  # args2.verbose будет False

Эти изменения повышают удобство и гибкость модуля argparse.

Расширенные примеры использования

Пример с подкомандами, как в git (commit, push):

Пример python
import argparse
parser = argparse.ArgumentParser(prog='git')
subparsers = parser.add_subparsers(dest='command', help='доступные команды')
parser_commit = subparsers.add_parser('commit', help='фиксация изменений')
parser_commit.add_argument('-m', '--message', required=True)
parser_push = subparsers.add_parser('push', help='отправка изменений')
parser_push.add_argument('--force', action='store_true')
args = parser.parse_args(['commit', '-m', 'новый коммит'])
print(f'Команда: {args.command}, сообщение: {args.message}')
Команда: commit, сообщение: новый коммит

Пример с пользовательским типом и валидацией:

Пример python
import argparse
def valid_port(value):
    try:
        port = int(value)
        if not 1 <= port <= 65535:
            raise argparse.ArgumentTypeError(f"Порт {port} вне диапазона 1-65535")
        return port
    except ValueError:
        raise argparse.ArgumentTypeError(f"Ожидается число, получено '{value}'")
parser = argparse.ArgumentParser()
parser.add_argument('--port', type=valid_port, default=80)
args = parser.parse_args(['--port', '8080'])
print(f'Порт: {args.port}')
Порт: 8080

Пример с mutually exclusive group (взаимоисключающие аргументы):

Пример python
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--enable', action='store_true')
group.add_argument('--disable', action='store_true')
args = parser.parse_args(['--enable'])
print(f'Состояние: {args.enable}')
Состояние: True

Пример чтения аргументов из файла с использованием fromfile_prefix_chars:

Пример python
import argparse
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('--host')
parser.add_argument('--port')
# Создаем файл config.txt с содержимым:
# --host
# localhost
# --port
# 5432
args = parser.parse_args(['@config.txt'])
print(f'Подключение к {args.host}:{args.port}')
Подключение к localhost:5432

питон ArgumentParser.parse_args function comments

En
ArgumentParser.parse args Parse known command-line arguments