Python 3. Параметры командной строки (argparse)
Введение
Модуль 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
Это шутка, я вообще не умею считать!
Если понравилась статья, подпишись на мой канал в VK или Telegram .