Python

Одна из сильнейших сторон Python — способность выполнять любые задачи. Его стандартная библиотека предоставляет достаточно функций для написания множества полезных сценариев и инструментов. А для получения больших возможностей можно просто воспользоваться pip install.

Почти каждый современный ЯП способен принимать аргументы из командной строки. Это очень важная функция, поскольку она допускает динамический ввод данных от пользователей, независимо от того, написали они программу или нет.

Python содержит несколько библиотек, благодаря которым код может принимать введенные пользователем данные из команды, таких как sys.argvgetopt и 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 важных компонента:

  1. Импорт argparse.
  2. Создание парсера аргументов (с описанием).
  3. Парсинг аргументов командной строки.

На втором этапе мы создаем объект 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)

Аргументы argparsea и b — добавлены в одну взаимоисключающую группу. Таким образом, Python не позволит отправлять a и b одновременно, подобно python3 argparse_8.py --a --b. Эта функция гарантирует, что пользователь не передаст противоречащие друг другу переменные одновременно, что позволяет избежать путаницы или ошибок.

Вот и все! Вы прошли простое руководство по аргументам командной строки Python.

Читайте также:


Перевод статьи George Seif: The Easy Guide to Python Command Line Arguments ?