Документация Python неофициальный перевод

getopt – анализатор параметров командной строки в стиле Cgetopt – C-style parser for command line options

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

Примечание

Этот модуль считается функционально завершённым. Более декларативная и расширяемая альтернатива этому API предоставляется в модуле optparse. Дополнительные функциональные улучшения для обработки параметров командной строки предоставляются либо сторонними модулями на PyPI, либо как возможности модуля argparse.


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

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

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

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). Каждая возвращаемая пара «опция-значение» содержит опцию в качестве первого элемента, с префиксом дефис для коротких опций (например, '-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"
    process(args, output=output, verbose=verbose)

if __name__ == "__main__":
    main()

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

import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)

Примерно эквивалентный интерфейс командной строки для этого случая также можно создать с помощью модуля argparse:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)

Подробнее о том, чем поведение версии argparse этого кода отличается от версии optparsegetopt), см. Выбор библиотеки разбора аргументов.

См. также

Модуль optparse

Декларативный разбор опций командной строки.

Модуль argparse

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