Spec-Zone.ru › Python 3.5

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

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

Возвращаемое значение состоит из двух элементов: первый — список пар «опция-значение»; второй — список аргументов программы, оставшихся после удаления списка опций (это фрагмент 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/getopt.html

Spec-Zone.ru

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