Spec-Zone.ru › Python 3.12

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 ..

См. также

Module argparse

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

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/getopt.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API