Разберемся раз и навсегда с передачей аргументов командной строки в сценарий на Python. Построим изложение так, чтобы в последующем эта статья послужила для вас удобным справочником.
Простой способ
Простым и наивным способом работы с аргументами командной строки является использование встроенного модуля sys. Так, обратившись к sys.argv, мы получим все переданные через пробел аргументы в виде списка (а также в качестве дополнительного бонуса - имя исполняемого файла). Приведу простой пример скрипта arg.py и результатов его запуска:
Обратите внимание, что в связи с ролью пробела в качестве разделителя аргументов, чтобы задать строку содержащую пробелы, следует взять ее в кавычки.
Продвинутый способ
Теперь рассмотрим более продвинутые инструменты работы с аргументами командной строки, которые предоставляет модуль argparse. На предварительном этапе создается экземпляр класса ArgumentParser, затем для каждого аргумента вызывается его метод add_argument, имеющий гибкие настройки для регулировки их обработки.
Сама процедура считывания входных аргументов инициируется вызовом метода parse класса ArgumentParser. После этого к ним можно обращаться как к свойствам экземпляра ArgumentParser. Теперь детальнее рассмотрим параметры метода add_argument:
- type - тип аргумента. Здесь же можно задать функцию для проверки введенного значения.
- required - регулирует необходимость задания аргумента при запуске сценария;
- default - задает значение по умолчанию;
- choices - определяет ограничивающее множество значений для аргумента;
- action - указывает на способ обработки значения аргумента. Часто это store – для сохранения значения или append – для добавления его в список;
- dest - указывает имя атрибута, в котором будет храниться значение аргумента после парсинга. Если не задано, то имя будет идентично имени аргумента;
- help - используется для описания аргумента при вызове сценария с параметром -h;
- metavar - расширяет описание переменной при вызове справки.
Теперь продемонстрируем их работу на практике:
type
Создадим и запустим следующий сценарий:
При указании в качестве значения параметра строки получили ожидаемую ошибку.
Если поменять в сценарии type на str получим следующие результаты:
Как видим, из-за строчного типа аргумента целое число 5 распознается как строка.
required
Так как указанный выше аргумент является обязательным, запустив сценарий без него, получим ошибку:
default
Добавим в сценарий еще один аргумент со значением по умолчанию и посмотрим на результат запуска без его указания:
choices
Теперь попробуем для второго аргумента задать значение не попадающее в список допустимых:
А так работает:
action
Теперь добавим еще один параметр, который будет отвечать за хранение флага при помощи свойства action:
Для этого аргумента значение задавать не нужно. Запустим сценарий с его указанием и без:
Продемонстрируем поведение программы при значении action=append. Для этого добавим еще один параметр:
Теперь вы можете задавать несколько значений последнего параметра (-s) и все они добавятся в список с именем 'settings':
Обратите внимание на то, что в этом же аргументе параметр type указывает на функцию check_value, которая проверяет, чтобы начало любого из значений совпадало с 'set'. Если это условие не соблюсти, получим ошибку:
dest
Как можно убедиться из приведенных выше скриншотов, именем атрибута, заданного параметром -s будет строка 'settings', заданная в dest.
help, metavar
Немного подправим описание параметров нашего скрипта и добавим новый, в котором будут аккумулироваться позиционных аргументы. Он же и будет содержать свойство metavar:
Теперь посмотрим, что получится при выводе справки: