Разбираем модуль argparse для Python 3, который используется для написания программ, которые могут принимать параметры командной строки.

Введение

Модуль argparse позволяем вашему приложению, написанному на Python 3, обрабатывать переданные аргументы командной строки. При этом мы можем использовать позиционные параметры, именные параметры и флаги.

Позиционные параметры

Допустим нам нужно запускать приложение hello.py таким образом: hello.py 3 5. А в ответ будем получать: 8.

Вот код такой программы, он достаточно откомментирован чтобы разобраться самостоятельно:

# Импортируем модуль argparse
import argparse

# Создаём объект parser, который будет отвечать за аргументы командной строки
parser = argparse.ArgumentParser()

# Создаём два позиционных аргумента (то есть первый аргумент попадёт в "a", а второй в "b")
# При создании аргументов можем указать тип данных (type), который хотим принять и подсказку (help)
parser.add_argument("a", type=int, help="Первый аргумент")
parser.add_argument("b", type=int, help="Второй аргумент")

# Создаём объект args. Он будет содержать все принятые агрументы
args = parser.parse_args()

# Создаём функцию, которая складывает два переданных ей числа и выводит их сумму
def f(a, b):
    print(a + b)

# Выполняем функцию. Передаём ей принятые из командной строки аргументы
f(args.a, args.b)

Вот как работает наша программа:

> hello.py 3 5
8

Если выполнить программу без параметров, то мы столкнемся с такой ошибкой:

> hello.py    
usage: hello.py [-h] a b
hello.py: error: the following arguments are required: a, b

Дело в том что позиционные аргументы командной строки считаются обязательными, а мы их не передали. Из вывода ясно что требуется указать два аргумента (a и b).

Также из вывода видно что можно использовать аргумент -h. Этот аргумент появляется автоматически и выводит справку по аргументам:

> hello.py -h
usage: hello.py [-h] a b

positional arguments:
  a           Первый аргумент
  b           Второй аргумент

options:
  -h, --help  show this help message and exit

Именованные аргументы

Такие аргументы командной строки являются не обязательными и должны начинаться с одинарного или двойного тире. При этом обычно указывается короткое и полное имя аргументов(-n, --name или -h, --help).

Создаются они точно также, просто перед именем ставится тире.

Вот пример кода с позиционными параметрами:

# Импортируем модуль argparse
import argparse

# Создаём объект parser, который будет отвечать за аргументы командной строки
parser = argparse.ArgumentParser()

# Создаём именованный аргумент
# Он дополнительно может иметь значение по умолчанию (default="Alex")
parser.add_argument("-n", "--name", type=str, default="Alex", help="Введите имя пользователя")

# Создаём объект args. Он будет содержать все принятые агрументы
args = parser.parse_args()

# Создаём функцию, которая принимает имя и выводит строку с этим именем
def hello(name):
    print(f"Hello {name}!")

# Выполняем функцию
hello(args.name)

Именованные аргументы — не обязательны. Но мы можем указать значение по умолчанию, тогда если мы не используем этот аргумент, то он получает значение по умолчанию.

Вот вывод такой утилиты:

> hello.py        
Hello Alex!

> hello.py -n Mike
Hello Mike!

> hello.py --name Elena
Hello Elena!

А так выглядит справка:

> hello.py -h
usage: hello.py [-h] [-n NAME]

options:
  -h, --help            show this help message and exit
  -n NAME, --name NAME  Введите имя пользователя

Аргументы флаги

Именованные аргументы можно использовать как флаги. Они работают таким образом: если аргумент передан он принимает значение True, а если не передан то False. Это можно использовать как опции для вашей программы.

Вот пример кода:

import argparse
parser = argparse.ArgumentParser()

# Создаём аргумент флаг, основным отличием является параметр:
# action='store_true' - означает, если аргумент использован то он принимает значение True
parser.add_argument("-f", "--flag", action='store_true', help="Используйте, чтобы поставить флаг")

args = parser.parse_args()

# Создаём функцию, которая выводит разные строки в зависимости от наличия флага
def f():
    if args.flag == True:
        print("Флаг стоит")
    else:
        print("Флаг не стоит")

# Выполняем функцию
f()

Такие аргументы создаются как именованные, то есть вначале ставится одно или два тире. Они не являются обязательными. А если мы написали бы action='store_false' — то при использовании этого аргумента флаг бы наоборот снимался (становился равным False).

Вот вывод данной программы:

> hello.py
Флаг не стоит

> hello.py -f
Флаг стоит

> hello.py -h
usage: hello.py [-h] [-f]

options:
  -h, --help  show this help message and exit
  -f, --flag  Используйте, чтобы поставить флаг

Такие аргументы используются чаще всего как дополнительные опции к вашей программе.

Сочетание разных типов аргументов

В качестве итога можем разобрать следующий код. Он использует все типы аргументов.

import argparse
parser = argparse.ArgumentParser()

# Позиционные обязательные параметр "a" и "b", с типом данных "int".
# Здесь нельзя указать значение по умолчанию.
parser.add_argument("a", type=int, help="Первый обязательный параметр") 
parser.add_argument("b", type=int, help="Второй обязательный параметр") 

# Именованный параметр "-t", может принимать в себя строки: "add" или "sub"
# по умолчанию "add"
parser.add_argument("-t", "--type", choices=("add", "sub"), default="add", help="Тип операции: add - сложение, sub - вычитание") 

# Параметр-флаг "-f", если применяется то флаг True
parser.add_argument("-f", "--fake", action='store_true', help="Если используется, то вместо расчета выводит шуточную строку")

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

# Функция сложения
def addition(a, b):
    print(a, '+', b, '=', a+b)

# Функция вычитания
def subtraction(a, b):
    print(a, '-', b, '=', a-b)

# Если укзали флаг (-f)
if args.fake == True:
    print("Это шутка, я вообще не умею считать!")
# Если флаг не стоит
else:
    # Если использовали --add
    if args.type == "add":
        addition(args.a, args.b)
    # Если использовали --sub
    elif args.type == "sub":
        subtraction(args.a, args.b)
    # В противном случаи
    else:
        print("Извините, я такое расчитать не смогу")

Примеры вывода:

> help.py -h
usage: help.py [-h] [-t {add,sub}] [-f] a b

positional arguments:
  a                     Первый обязательный параметр
  b                     Второй обязательный параметр

options:
  -h, --help            show this help message and exit
  -t {add,sub}, --type {add,sub}
                        Тип операции: add - сложение, sub - вычитание
  -f, --fake            Если используется, то вместо расчета выводит шуточную строку

> help.py -t add 2 3
2 + 3 = 5

> help.py -t sub 5 3
5 - 3 = 2

> help.py 5 3
5 + 3 = 8

> help.py -f -t sub 5 3
Это шутка, я вообще не умею считать!

Дополнительно можете дополнительно почитать про этот модуль — здесь.

Сводка
Python 3 Параметры командной строки (argparse)
Имя статьи
Python 3 Параметры командной строки (argparse)
Описание
Разбираем модуль argparse для Python 3, который используется для написания программ, которые могут принимать параметры командной строки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *