getopt — Парсер в стиле C для опций командной строки

Исходный код: Lib/getopt.py.

Примечание

Модуль getopt - это анализатор опций командной строки, API которого разработан так, чтобы быть знакомым пользователям функции C getopt(). Пользователи, не знакомые с функцией C getopt() или желающие писать меньше кода и получать более качественную справку и сообщения об ошибках, должны рассмотреть возможность использования модуля argparse вместо него.


Этот модуль помогает скриптам разбирать аргументы командной строки в sys.argv. Он поддерживает те же соглашения, что и функция Unix getopt() (включая специальные значения аргументов вида „-“ и „--„). Длинные опции, аналогичные тем, которые поддерживаются программами GNU, также могут быть использованы через необязательный третий аргумент.

Этот модуль предоставляет две функции и исключение:

getopt.getopt(args, shortopts, longopts=[])

Разбирает параметры командной строки и список параметров. args - это список аргументов, который нужно разобрать, без ведущей ссылки на запущенную программу. Обычно это означает sys.argv[1:]. shortopts - это строка букв опций, которые скрипт хочет распознать, причем опции, требующие аргумента, сопровождаются двоеточием (':'; т.е. тот же формат, который использует Unix getopt()).

Примечание

В отличие от GNU getopt(), после аргумента без опции все последующие аргументы считаются также не опциями. Это похоже на то, как работают Unix-системы, не относящиеся к GNU.

longopts, если указано, должно представлять собой список строк с именами длинных опций, которые должны поддерживаться. Ведущие символы '--' не должны включаться в имя опции. За длинными опциями, требующими аргумента, должен следовать знак равенства ('='). Необязательные аргументы не поддерживаются. Чтобы принимать только длинные опции, shortopts должна быть пустой строкой. Длинные опции в командной строке могут быть распознаны, если они содержат префикс имени опции, который в точности совпадает с одной из принятых опций. Например, если longopts - ['foo', 'frob'], то опция --fo будет соответствовать как --foo, но --f не будет соответствовать однозначно, поэтому будет поднят вопрос GetoptError.

Возвращаемое значение состоит из двух элементов: первый - список пар (option, value); второй - список аргументов программы, оставшихся после удаления списка опций (это трейлинг-фрагмент args). Каждая возвращаемая пара опция-значение имеет опцию в качестве первого элемента, с префиксом в виде дефиса для коротких опций (например, '-x') или двух дефисов для длинных опций (например, '--long-option'), и аргумент опции в качестве второго элемента, или пустую строку, если опция не имеет аргумента. Опции располагаются в списке в том же порядке, в котором они были найдены, что позволяет использовать их несколько раз. Длинные и короткие опции могут смешиваться.

getopt.gnu_getopt(args, shortopts, longopts=[])

Эта функция работает как getopt(), за исключением того, что по умолчанию используется режим сканирования в стиле GNU. Это означает, что опциональные и не опциональные аргументы могут смешиваться. Функция getopt() прекращает обработку опций, как только встречается аргумент, не являющийся опцией.

Если первый символ строки опций равен '+', или если установлена переменная окружения POSIXLY_CORRECT, то обработка опций прекращается, как только встречается аргумент, не являющийся опцией.

exception getopt.GetoptError

Возникает, если в списке аргументов обнаружена нераспознанная опция или если опция, требующая аргумента, не указана. Аргументом исключения является строка, указывающая на причину ошибки. Для длинных опций аргумент, заданный для опции, которая не требует аргумента, также вызовет это исключение. Атрибуты msg и opt дают сообщение об ошибке и связанную с ней опцию; если нет конкретной опции, к которой относится исключение, opt - пустая строка.

exception getopt.error

Псевдоним для GetoptError; для обратной совместимости.

Пример, использующий только опции стиля Unix:

>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
>>> args
['a1', 'a2']

Использование длинных имен опционов также просто:

>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args = s.split()
>>> args
['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'x', [
...     'condition=', 'output-file=', 'testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]
>>> args
['a1', 'a2']

В сценарии обычно используется примерно следующее:

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print(err)  # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-o", "--output"):
            output = a
        else:
            assert False, "unhandled option"
    # ...

if __name__ == "__main__":
    main()

Обратите внимание, что эквивалентный интерфейс командной строки можно создать с меньшим количеством кода и более информативными сообщениями о помощи и ошибках, используя модуль argparse:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    args = parser.parse_args()
    # ... do something with args.output ...
    # ... do something with args.verbose ..

См.также

Модуль argparse

Альтернативная библиотека разбора опций и аргументов командной строки.

Вернуться на верх