Разбираем модуль 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 Это шутка, я вообще не умею считать!
Дополнительно можете дополнительно почитать про этот модуль — здесь.