Язык программирования Python

Аргументы командной строки в Python. Модуль argparse

Иногда при вызове программы Python из командной строки нам нужно передать определенные аргументы, чтобы указать, как должен действовать код.

Обычно это определенные опции, которые заставляют его работать более специфическим образом в соответствии с потребностями пользователя.

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

Например, когда мы выводим список каталогов в Linux, мы используем команду “ls”.

Но мы можем передать в качестве аргумента ‘-l’, чтобы показать его в виде списка с дополнительной информацией о файлах и каталогах.

>ls argparse.py test.py
Code language: CSS (css)
>ls -l -rw-r--r--. 1 user group 47 ago 30 11:32 argparse.py -rw-r--r--. 1 user group 30 jun 11 10:36 test.py
Code language: CSS (css)

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

Шаг аргументов

Способ получения аргументов от программы Python осуществляется благодаря функции “argv” в модуле “sys”.

Эта функция собирает все аргументы и возвращает их в виде списка.

Здесь мы видим программу, которая собирает параметры и печатает их на экране:

import sys print(sys.argv)
Code language: JavaScript (javascript)
python arguments.py arg1 arg2 arg3 ['arguments.py', 'arg1', 'arg2', 'arg3']
Code language: CSS (css)

Обратите внимание, что выполнение приводит к выводу всех аргументов.

То есть, название программы также собирается как параметр и выводится на экран, поэтому оно будет сохранено в позиции 0 собранного списка.

Чтобы увидеть более наглядный пример того, как это работает, мы можем сделать программу на Python, которая суммирует все значения, переданные в качестве аргументов в строке кода.

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

Для этого мы сделаем цикл “for”, который будет проходить через все аргументы (sys.argv), и мы будем складывать их по одному, чтобы получить общее количество.

import sys sum=0 for i in range(len(sys.argv)-1): sum = sum+int(sys.argv[i+1]) print (‘Cуммамаа: ’+str(sum))
Code language: JavaScript (javascript)
python arguments.py 5 7 2 Cуммамаа: 14
Code language: JavaScript (javascript)

Теперь мы изменим нашу программу так, чтобы она могла складывать и умножать.

Сначала в первом аргументе мы передаем слово “sum” или “multiply”, а в остальных аргументах – числа, которые мы собираемся сложить или умножить.

Программа будет выглядеть следующим образом:

import sys sum=0 multiply=1 args=sys.argv if args[1].upper() =='SUM': for i in range(len(args)-2): sum = sum + int(args[i+2]) print ('Сумма: '+str(sum)) elif args[1].upper() =='MULTIPLY': for i in range(len(args)-2): multiply = multiply * int(args[i+2]) print ('Результат умножения: '+str(multiply))
Code language: PHP (php)
python arguments.py sum 5 7 2 Сумма: 14 python arguments.py multiply 5 7 2 Результат: 70 python arguments.py 5 7 2
Code language: JavaScript (javascript)

Как мы видели в предыдущих примерах, способ доступа к аргументам, поступающим из командной строки, в Python очень прост.

Что действительно сложнее, так это их валидация, поскольку пользователь может разместить аргументы неправильно или в ненужных местах, и это может привести к сбою или некорректной работе программы.

Argparse

Для выполнения задачи по сбору аргументов в Python мы можем использовать модуль “argparse”.

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

Чтобы использовать этот инструмент, мы должны импортировать модуль “argparse”.

Import argparse

Затем argparse объявляется с помощью функции “ArgumentParser”.

parser = argparse.ArgumentParser(description='Descripcion opcional')
Code language: JavaScript (javascript)

В завершение необходимо вызвать “parse_args” для преобразования строк в объекты.

args = parser.parse_args()

Эта структура будет базовой для использования инструмента.

Для проверки его работы мы можем использовать аргумент -h, чтобы получить справку.

Справка показывает, как использовать инструмент, описание и аргументы.

Очевидно, что пока эта справка пуста, но она будет постепенно дополняться следующими примерами:

import argparse parser = argparse.ArgumentParser(description='Тестовая программа') args = parser.parse_args()
Code language: JavaScript (javascript)
python argparse.py -h usage: argparse.py [-h] Тестовая программа optional arguments: -h, --help show this help message and exit
Code language: CSS (css)

Ознакомившись с описанием, мы создадим аргументы, которые ожидаются в каждой строке кода.

Для определения ожидаемых аргументов мы используем функцию “add_argument”.

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

Структура выглядит следующим образом:

add_argument(name...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
Code language: CSS (css)

Где:

  • name – Имя или список имен (например: foo или -f, -foo)
  • action – Действие, которое следует предпринять, когда аргумент встречается в командной строке.
  • nargs – Количество аргументов, которые она имеет.
  • const – Постоянное значение, требуемое некоторыми действиями или nargs.
  • default – Значение по умолчанию, если аргумент не найден в командной строке.
  • type – тип данных аргумента
  • choices – Допустимые значения для данного значения.
  • required – Указывает, обязательна ли команда или нет. Если не указан, то она является необязательной.
  • help – Описание того, что делает аргумент.
  • metavar – Имя, которое аргумент принимает в сообщении о применении (-h).
  • dest – Имя атрибута, который будет возвращен объекту.

Мы собираемся посмотреть, как это работает, на том же примере, который мы рассматривали в предыдущем разделе.

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

Это простой пример, но он позволяет увидеть все рассмотренные ранее варианты:

import argparse parser = argparse.ArgumentParser(description='Сумма/умножение списка значений') parser.add_argument('-op' , metavar='operation' , type=str , help='Запуск операции' , choices=['sum', 'multiply'] , required=True) parser.add_argument('-val' , metavar='значения' , type=int , help='Значения, которые нужно сложить или умножить' , nargs='*' , dest='значения' , required=True ) parser.add_argument('-d' , '--debug' , help='Активация отладки программы' , action='store_true' , dest='debug' , default=False) args = parser.parse_args() #Программа total=0 if args.op.upper()=='MULTIPLY': total=1 for i in range(len(args.values)): if (args.op.upper()=='SUM'): total = total + args.values[i] else: total = total * args.values[i] if args.debug: print('Отладка. Промежуточный этап, всего: '+str(total)) print ('Итого: '+str(total))
Code language: PHP (php)

Как вы видите, мы объявили три аргумента в нашей программе.

Первый – ‘-op’, он подбирает тип операции, которая будет выполняться, тип строки, он обязателен и позволяет вставить только “sum” или “multiply”.

Второй – объектные значения операции. Это также обязательное поле, его значение хранится в переменной “values” и может принимать от 0 до n значений.

Третий используется для активации режима отладки. Поэтому, если вы не укажете это в командной строке, оно будет установлено в false, и режима отладки не будет. Если вместо этого мы поместим его в командную строку, он примет значение true и будет показана отладка.

1) Запустим справку с помощью параметра -h. Далее проверяем, чтобы вышла полная справка, с формой использования, описанием программы и параметрами, которые она принимает.

python argparse.py -h usage: argparse.py [-h] -op operation -val [значенияенияияя[-d] Сумма/умножение optional arguments: -h, --help show this help message and exit -op operation Запускуск -val [значенияенияияя, которые -d, --debug Активация
Code language: JavaScript (javascript)

2) Если отсутствуют обязательные аргументы, то выдается ошибка, указывающая, какие именно аргументы отсутствуют:

python argparse.py usage: argparse.py [-h] -op operation -val [значения ...] [-d] test.py: error: the following arguments are required: -op, -val
Code language: CSS (css)

3) Если выбрана операция, отличная от сложения или умножения, она также проверяет ее:

python argparse.py -op division 1 3 usage: argparse.py [-h] -op operation -val [значенияенияияя[-d] test.py: error: argument -op: invalid choice: 'division' (choose from 'sum', 'multiply')
Code language: JavaScript (javascript)

4) Сумма трех значений:

python argparse.py -op sum -val 3 1 5 Итого: 9
Code language: CSS (css)

5) Умножение двух значений:

python argparse.py -op multiply -val 3 5 Итого: 15
Code language: CSS (css)

6) Сумма 4 значений при включенной отладке:

python argparse.py -op sum -val 3 1 5 4 --debug Отладка. Промежуточный этап, всего: 3 Отладка. Промежуточный этап, всего: 4 Отладка. Промежуточный этап, всего: 9 Отладка. Промежуточный этап, всего: 13 Итого: 13
Code language: CSS (css)

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

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