====== Работа с аргументами командной строки ======
* Аргументы командной строки — основной способ передачи параметров консольным приложениям
* Интерпретатор 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|документации]].