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