Работа с аргументами командной строки

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