Одна из сильнейших сторон Python — способность выполнять любые задачи. Его стандартная библиотека предоставляет достаточно функций для написания множества полезных сценариев и инструментов. А для получения больших возможностей можно просто воспользоваться pip install
.
Почти каждый современный ЯП способен принимать аргументы из командной строки. Это очень важная функция, поскольку она допускает динамический ввод данных от пользователей, независимо от того, написали они программу или нет.
Python содержит несколько библиотек, благодаря которым код может принимать введенные пользователем данные из команды, таких как sys.argv
, getopt
и argparse
. На данный момент argparse
— наилучший и наиболее распространенный вариант.
Библиотека Python argparse была выпущена как часть стандартной библиотеки вместе с Python 3.2. После этого релиза в силу своей популярности она была интегрирована в Python 2.7 и во все будущие версии Python, быстро став золотым стандартом для работы с аргументами командной строки. Она предоставляет следующие функции:
Проведем небольшую экскурсию по библиотеке argparse
Python.
Откройте пустой сценарий Python. Библиотека argparse встроена в Python, соответственно процедура установки не потребуется. На фрагменте кода ниже показано, как создать начальную установку для argparse:
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
args = parser.parse_args()
В этом коде есть 3 важных компонента:
argparse
.На втором этапе мы создаем объект parser, с помощью которого можно добавлять аргументы командной строки вместе с опциями для каждого из них. На третьем этапе запускается функция, которая извлекает введенные пользователем аргументы из командной строки.
Прелесть argparse
заключается в том, что она автоматически работает с командной строкой с помощью этой простой настройки. Запустите программу с --help
в конце и argparse
выведет описание руководства по argparse!
Теперь добавим аргумент командной строки с именем «a», как показано во фрагменте кода ниже. Чтобы передать аргумент командной строки в сценарий Python, запустите его с помощью python3 argparse_2.py --a=5
:
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a")
args = parser.parse_args()
a = args.a
print(a)
Обратите внимание на использование функции .add_argument()
для передачи «a» в качестве аргумента командной строки. Чтобы получить доступ к переменной, полученной из a
, используем args.a
.
Следует отметить, что без указания значения для a
в командной строке args.a
будет None
. Чтобы обойти это, указываем значение по умолчанию для a
в парсере аргумента, как показано ниже. Обратите внимание, что на этот раз также добавлено описание.
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, help="This is the 'a' variable")
args = parser.parse_args()
a = args.a
print(a)
В данном случае, если мы не передадим значение для a
через командную строку, то a
приобретет значение по умолчанию, равное 1. Добавив строку для переменной help
, мы также сможем напечатать более эффективное описание для каждой переменной, используя --help
:
usage: run.py [-h] [--a A]
A tutorial of argparse!
optional arguments:
-h, --help show this help message and exit
--a A This is the 'a' variable
Рассмотрим еще несколько интересных опций с argparse
. Во-первых, мы можем указать информацию о типе каждой переменной так, чтобы преобразование типов выполнялось прямо на входе:
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, type=int, help="This is the 'a' variable")
parser.add_argument("--name", default=None, type=str, help="Your name")
args = parser.parse_args()
Чтобы убедиться, что пользователь всегда передает значение для определенного аргумента можно использовать ключевое слово required
. Установленное значение True
вынуждает пользователя вводить данные только для этого значения, иначе программа выдаст ошибку и остановится.
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, type=int, help="This is the 'a' variable")
parser.add_argument("--name", required=True, type=str, help="Your name")
args = parser.parse_args()
Если мы установим значение для аргумента --name
, то программа будет работать отлично! Однако при его отсутствии мы получим подобное сообщение об ошибке:
usage: run.py [-h] [--a A] --name NAME
run.py: error: the following arguments are required: --name
Мы также можем ввести возможные значения для определенного аргумента командной строки с помощью аргумента choices
. Полезная функция, особенно при наличии в коде набора операторов if-else, которые выполняют определенные операции на основе одной строки. Пример:
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", default=1, type=int, help="This is the 'a' variable")
parser.add_argument("--education",
choices=["highschool", "college", "university", "other"],
required=True, type=str, help="Your name")
args = parser.parse_args()
ed = args.education
if ed == "college" or ed == "university":
print("Has degree")
elif ed == "highschool":
print("Finished Highschool")
else:
print("Does not have degree")
Теперь при вводе любого значения, находящегося в списке choices, код будет работать и примет аргумент education
. Однако при вводе того, что отсутствует в списке, например, числа 5
, вы получите следующее сообщение, в котором предлагается выбрать варианты из списка:
usage: run.py [-h] [--a A] --education {highschool,college,university,other}
run.py: error: argument --education: invalid choice: '5' (choose from 'highschool', 'college', 'university', 'other')
Настало время двигаться дальше и перейти к продвинутому argparse!
В аргументе action
можно указать действие, которое должен принимать парсер аргументов. Например, аргумент, который автоматически устанавливается равным булевому значению True
, если оно присутствует или является константой. В примере ниже показаны оба случая.
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
parser.add_argument("--a", action="store_true", help="This is the 'a' variable")
parser.add_argument("--b", action="store_const", const=10,
help="This is the 'b' variable")
args = parser.parse_args()
a = args.a
b = args.b
print(a)
print(b)
В приведенном выше коде говорится, что если в командной строке присутствует аргумент a
, то он будет иметь значение True
, а в противном случае False
. Аналогичным образом, при наличии аргумента командной строки b
он должен иметь значение 10
, а в противном случае None
из-за отсутствия значения по умолчанию!
Мы также можем установить так называемые взаимоисключающие группы, определяющие набор аргументов командной строки парсера, которые не могут быть переданы одновременно.
Пример:
import argparse
parser = argparse.ArgumentParser(description='A tutorial of argparse!')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--a', action='store_true', help="This is the 'a' variable")
group.add_argument('--b', action='store_true', help="This is the 'b' variable")
args = parser.parse_args()
a = args.a
b = args.b
print(a)
print(b)
Аргументы argparse
— a
и b
— добавлены в одну взаимоисключающую группу. Таким образом, Python не позволит отправлять a
и b
одновременно, подобно python3 argparse_8.py --a --b
. Эта функция гарантирует, что пользователь не передаст противоречащие друг другу переменные одновременно, что позволяет избежать путаницы или ошибок.
Вот и все! Вы прошли простое руководство по аргументам командной строки Python.
Перевод статьи George Seif: The Easy Guide to Python Command Line Arguments 😎
Комментарии