getopt — С-подобный парсер параметров командной строки

Исходный код: 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(), после непараметрического аргумента все дальнейшие аргументы считаются также непараметрами. Это аналогично тому, как работают не- GNU Unix системы.

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

возвращает значение состоит из двух элементов: первый - список (option, value) пар; второй - список программных аргументов, оставшихся после удаления списка опций (это задний срез args). У каждого option-значение возвращенный пары есть выбор как его первый элемент, снабженный префиксом дефис для коротких вариантов (например, '-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(err)  # напечатает что-то вроде "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
Альтернативная библиотека парсинга опций командной строки и аргументов.