====== Работа с аргументами командной строки ====== * Аргументы командной строки — основной способ передачи параметров консольным приложениям * Интерпретатор Python рассматривает все аргументы переданные после имени скрипта, как аргументы скрипта * По традиции 0-вой аргумент — имя скрипта * Доступ к аргументам напрямую — список ''argv'' модуля ''sys''. import sys print(sys.argv) python3 test.py a 24 --test "long arg" ['test.py', 'a', '24', '--test', 'long arg']
===== Пара слов о традициях обработки аргументов ===== * По традиции аргументы делятся на ключи/флаги и собственно аргументы. По традиции ключи/флаги начинаются с символа ''-'' * По традиции ключи имеют собственные аргументы (''-x 258''), а флаги — нет (''-x''). * По традиции любой ключ/флаги программы может быть передан в короткой и длинной форме: -o file.txt --output-file file.txt -v --verbose * По традиции собственно аргументы передаются после ключей/флагов по порядку python3 script.py -v -o file.txt Arg1 Arg2
===== Работа с модулем argparse ===== Для разбора аргументов командной строки в стандартной библиотеке есть модуль ''argparse''. * Создать объект — парсер * Описать возможные аргументы с помощью вызовов функций парсера * Запустить паресер * Парсер сконструирует объект в полях которого будут значения соответствующих аргументов
==== Описание аргументов ==== import argparse parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", action="store_true", default=False, help="Подробный вывод") parser.add_argument("-i", "--input", action="store", required=True, help="Входной файл (обязательный аргумент)") parser.add_argument("-o", "--output", action="store", default="out.dat", help="Выходной файл (по умолчанию out.dat)") parser.add_argument('var', type=int, help='Первый обязательный аргумент') parser.add_argument('livar', nargs='+', help='Один или более обязательных аргументов') args = parser.parse_args()
==== Автоматическая генерация справки ==== > python3 test.py usage: test.py [-h] [-v] -i INPUT [-o OUTPUT] var livar [livar ...] test.py: error: the following arguments are required: -i/--input, var, livar > python3 test.py -h usage: test.py [-h] [-v] -i INPUT [-o OUTPUT] var livar [livar ...] positional arguments: var Первый обязательный аргумент livar Один или более обязательных аргументов optional arguments: -h, --help show this help message and exit -v, --verbose Подробный вывод -i INPUT, --input INPUT Входной файл (обязательный аргумент) -o OUTPUT, --output OUTPUT Выходной файл (по умолчанию out.dat)
==== Результат работы ==== print(args) print(args.verbose) print(args.input) print(args.output) print(args.var) print(args.livar) > python3 test.py -i input.txt -o output.dat -v 43 a b c Namespace(input='input.txt', livar=['a', 'b', 'c'], output='output.dat', var=43, verbose=True) True input.txt output.dat 43 ['a', 'b', 'c']
===== Что еще нужно знать об аргументах ===== * У Python тоже есть свои аргументы, например ''python3 -u -B test.py'', они недоступны скрипту. * Оболочка командной строки может поддерживать шаблоны, например ''*.txt''. При этом в ''sys.argv'' окажется список всех ''.txt'' файлов в текущей папке подряд. Для разбора таких аргументов нужно использовать ''nargs='+''' в ''argparse''. * Иногда используются не пары ключ-значение (''-v 3''), а многократное указание одного и того-же ключа (''-v -v -v''), с другой стороны принятый в С подход с группировкой ключей (''-vvv'') в ''argparse'' не поддерживается. * Как модифицировать вывод справки, генерируемой ''argparse'' подробно описано в [[https://docs.python.org/3/library/argparse.html|документации]].