Найти тему
Властелин машин

Ключевое о передаче аргументов командной строки в Python

Оглавление

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

Простой способ

Простым и наивным способом работы с аргументами командной строки является использование встроенного модуля sys. Так, обратившись к sys.argv, мы получим все переданные через пробел аргументы в виде списка (а также в качестве дополнительного бонуса - имя исполняемого файла). Приведу простой пример скрипта arg.py и результатов его запуска:

-2

-3

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

Продвинутый способ

Теперь рассмотрим более продвинутые инструменты работы с аргументами командной строки, которые предоставляет модуль argparse. На предварительном этапе создается экземпляр класса ArgumentParser, затем для каждого аргумента вызывается его метод add_argument, имеющий гибкие настройки для регулировки их обработки.

Сама процедура считывания входных аргументов инициируется вызовом метода parse класса ArgumentParser. После этого к ним можно обращаться как к свойствам экземпляра ArgumentParser. Теперь детальнее рассмотрим параметры метода add_argument:

  • type - тип аргумента. Здесь же можно задать функцию для проверки введенного значения.
  • required - регулирует необходимость задания аргумента при запуске сценария;
  • default - задает значение по умолчанию;
  • choices - определяет ограничивающее множество значений для аргумента;
  • action - указывает на способ обработки значения аргумента. Часто это store – для сохранения значения или append – для добавления его в список;
  • dest - указывает имя атрибута, в котором будет храниться значение аргумента после парсинга. Если не задано, то имя будет идентично имени аргумента;
  • help - используется для описания аргумента при вызове сценария с параметром -h;
  • metavar - расширяет описание переменной при вызове справки.

Теперь продемонстрируем их работу на практике:

type

Создадим и запустим следующий сценарий:

-4

-5

При указании в качестве значения параметра строки получили ожидаемую ошибку.

Если поменять в сценарии type на str получим следующие результаты:

-6

Как видим, из-за строчного типа аргумента целое число 5 распознается как строка.

required

Так как указанный выше аргумент является обязательным, запустив сценарий без него, получим ошибку:

-7

default

Добавим в сценарий еще один аргумент со значением по умолчанию и посмотрим на результат запуска без его указания:

-8
-9

choices

Теперь попробуем для второго аргумента задать значение не попадающее в список допустимых:

-10

А так работает:

-11

action

Теперь добавим еще один параметр, который будет отвечать за хранение флага при помощи свойства action:

-12

Для этого аргумента значение задавать не нужно. Запустим сценарий с его указанием и без:

-13

Продемонстрируем поведение программы при значении action=append. Для этого добавим еще один параметр:

-14

Теперь вы можете задавать несколько значений последнего параметра (-s) и все они добавятся в список с именем 'settings':

-15

Обратите внимание на то, что в этом же аргументе параметр type указывает на функцию check_value, которая проверяет, чтобы начало любого из значений совпадало с 'set'. Если это условие не соблюсти, получим ошибку:

-16

dest

Как можно убедиться из приведенных выше скриншотов, именем атрибута, заданного параметром -s будет строка 'settings', заданная в dest.

help, metavar

Немного подправим описание параметров нашего скрипта и добавим новый, в котором будут аккумулироваться позиционных аргументы. Он же и будет содержать свойство metavar:

-17

Теперь посмотрим, что получится при выводе справки:

-18

Наука
7 млн интересуются