getopt.md
1> **Источник:** https://python-all.ru/3.16/library/getopt.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `getopt` – анализатор параметров командной строки в стиле C89**Исходный код:** [Lib/getopt.py](https://python-all.ru/src/main/Lib/getopt.py)1011> **Примечание**12>13> Этот модуль считается функционально завершённым. Более декларативная и расширяемая альтернатива этому API предоставляется в модуле [`optparse`](https://python-all.ru/3.16/library/optparse.html#module-optparse). Дополнительные функциональные улучшения для обработки параметров командной строки предоставляются либо сторонними модулями на PyPI, либо как возможности модуля [`argparse`](https://python-all.ru/3.16/library/argparse.html#module-argparse).1415---1617Этот модуль помогает скриптам разбирать аргументы командной строки в `sys.argv`. Он поддерживает те же соглашения, что и функция Unix `getopt()` (включая особые значения аргументов вида '`-`' и '`--`'). Длинные опции, подобные поддерживаемым программным обеспечением GNU, также могут использоваться через необязательный третий аргумент.1819Пользователям, не знакомым с функцией Unix `getopt()`, следует рассмотреть использование модуля [`argparse`](https://python-all.ru/3.16/library/argparse.html#module-argparse). Пользователи, знакомые с функцией Unix `getopt()`, но желающие получить эквивалентное поведение, написав меньше кода и получая более качественные справку и сообщения об ошибках, должны рассмотреть использование модуля [`optparse`](https://python-all.ru/3.16/library/optparse.html#module-optparse). Подробнее см. [Выбор библиотеки разбора аргументов](https://python-all.ru/3.16/library/optparse.html#choosing-an-argument-parser).2021Этот модуль предоставляет две функции и одно исключение:2223#### `getopt.getopt(args, shortopts, longopts=[])`2425Разбирает параметры командной строки и список аргументов. *args* – это список аргументов для разбора, без ссылки на выполняемую программу. Обычно это означает `sys.argv[1:]`. *shortopts* – это строка букв опций, которые скрипт хочет распознавать, где опции, требующие аргумента, сопровождаются двоеточием (`':'`), а опции, принимающие необязательный аргумент, сопровождаются двумя двоеточиями (`'::'`); то есть тот же формат, который использует Unix `getopt()`.2627> **Примечание**28>29> В отличие от GNU `getopt()`, после неопционного аргумента все последующие аргументы также считаются неопционными. Это аналогично тому, как работают не-GNU Unix-системы.3031*longopts*, если указан, должен быть списком строк с именами длинных опций, которые должны поддерживаться. Начальные символы `'--'` не должны включаться в имя опции. Длинные опции, требующие аргумента, должны сопровождаться знаком равенства (`'='`). Длинные опции, принимающие необязательный аргумент, должны сопровождаться знаком равенства и вопросительным знаком (`'=?'`). Чтобы принимать только длинные опции, *shortopts* должна быть пустой строкой. Длинные опции в командной строке могут распознаваться, если они предоставляют префикс имени опции, который точно совпадает с одной из принятых опций. Например, если *longopts* равен `['foo', 'frob']`, опция `--fo` будет соответствовать `--foo`, но `--f` не будет соответствовать однозначно, поэтому будет возбуждено [`GetoptError`](https://python-all.ru/3.16/library/getopt.html#getopt.GetoptError).3233Возвращаемое значение состоит из двух элементов: первый – список пар `(option, value)`; второй – список аргументов программы, оставшихся после удаления списка опций (это конечный срез *args*). Каждая возвращаемая пара «опция-значение» содержит опцию в качестве первого элемента, с префиксом дефис для коротких опций (например, `'-x'`) или двух дефисов для длинных опций (например, `'--long-option'`), и аргумент опции в качестве второго элемента, или пустую строку, если у опции нет аргумента. Опции располагаются в списке в том же порядке, в котором они были найдены, что допускает повторения. Длинные и короткие опции могут смешиваться.3435Изменено в версии 3.14: Поддерживаются необязательные аргументы.3637#### `getopt.gnu_getopt(args, shortopts, longopts=[])`3839Эта функция работает как [`getopt()`](https://python-all.ru/3.16/library/getopt.html#module-getopt), за исключением того, что по умолчанию используется режим сканирования в стиле GNU. Это означает, что опционные и неопционные аргументы могут перемешиваться. Функция `getopt()` прекращает обработку опций, как только встречается неопционный аргумент.4041Если первый символ строки опций – `'+'`, или установлена переменная окружения `POSIXLY_CORRECT`, то обработка опций прекращается, как только встречается неопционный аргумент.4243Если первый символ строки опций – `'-'`, неопционные аргументы, за которыми следуют опции, добавляются в список пар опция-значение как пара, первым элементом которой является `None`, а вторым – список неопционных аргументов. Второй элемент результата `gnu_getopt()` – это список аргументов программы после последней опции.4445Изменено в версии 3.14: Поддержка возврата перемешанных опций и неопционных аргументов по порядку.4647#### `exception getopt.GetoptError`4849Это исключение возбуждается, когда в списке аргументов обнаружена нераспознанная опция или когда опции, требующей аргумента, не передано ни одного. Аргумент исключения – строка, указывающая причину ошибки. Для длинных опций передача аргумента опции, которая его не требует, также вызовет это исключение. Атрибуты `msg` и `opt` содержат сообщение об ошибке и соответствующую опцию; если нет конкретной опции, к которой относится исключение, `opt` является пустой строкой.5051#### `exception getopt.error`5253Псевдоним для [`GetoptError`](https://python-all.ru/3.16/library/getopt.html#getopt.GetoptError); для обратной совместимости.5455Пример использования только опций в стиле Unix:5657```pycon58>>> import getopt59>>> args = '-a -b -cfoo -d bar a1 a2'.split()60>>> args61['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']62>>> optlist, args = getopt.getopt(args, 'abc:d:')63>>> optlist64[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]65>>> args66['a1', 'a2']67```6869Использование длинных имён опций так же просто:7071```pycon72>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'73>>> args = s.split()74>>> args75['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']76>>> optlist, args = getopt.getopt(args, 'x', [77... 'condition=', 'output-file=', 'testing'])78>>> optlist79[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]80>>> args81['a1', 'a2']82```8384Необязательные аргументы должны указываться явно:8586```pycon87>>> s = '-Con -C --color=off --color a1 a2'88>>> args = s.split()89>>> args90['-Con', '-C', '--color=off', '--color', 'a1', 'a2']91>>> optlist, args = getopt.getopt(args, 'C::', ['color=?'])92>>> optlist93[('-C', 'on'), ('-C', ''), ('--color', 'off'), ('--color', '')]94>>> args95['a1', 'a2']96```9798Порядок опций и неопционных аргументов может быть сохранён:99100```pycon101>>> s = 'a1 -x a2 a3 a4 --long a5 a6'102>>> args = s.split()103>>> args104['a1', '-x', 'a2', 'a3', 'a4', '--long', 'a5', 'a6']105>>> optlist, args = getopt.gnu_getopt(args, '-x:', ['long='])106>>> optlist107[(None, ['a1']), ('-x', 'a2'), (None, ['a3', 'a4']), ('--long', 'a5')]108>>> args109['a6']110```111112В скрипте типичное использование выглядит примерно так:113114```python115import getopt, sys116117def main():118 try:119 opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])120 except getopt.GetoptError as err:121 # вывести справочную информацию и завершить работу:122 print(err) # выведет что-то вроде "option -a not recognized"123 usage()124 sys.exit(2)125 output = None126 verbose = False127 for o, a in opts:128 if o == "-v":129 verbose = True130 elif o in ("-h", "--help"):131 usage()132 sys.exit()133 elif o in ("-o", "--output"):134 output = a135 else:136 assert False, "unhandled option"137 process(args, output=output, verbose=verbose)138139if __name__ == "__main__":140 main()141```142143Обратите внимание, что эквивалентный интерфейс командной строки можно создать с меньшим объёмом кода и более информативными справкой и сообщениями об ошибках, используя модуль [`optparse`](https://python-all.ru/3.16/library/optparse.html#module-optparse):144145```python146import optparse147148if __name__ == '__main__':149 parser = optparse.OptionParser()150 parser.add_option('-o', '--output')151 parser.add_option('-v', dest='verbose', action='store_true')152 opts, args = parser.parse_args()153 process(args, output=opts.output, verbose=opts.verbose)154```155156Примерно эквивалентный интерфейс командной строки для этого случая также можно создать с помощью модуля [`argparse`](https://python-all.ru/3.16/library/argparse.html#module-argparse):157158```python159import argparse160161if __name__ == '__main__':162 parser = argparse.ArgumentParser()163 parser.add_argument('-o', '--output')164 parser.add_argument('-v', dest='verbose', action='store_true')165 parser.add_argument('rest', nargs='*')166 args = parser.parse_args()167 process(args.rest, output=args.output, verbose=args.verbose)168```169170Подробнее о том, чем поведение версии `argparse` этого кода отличается от версии `optparse` (и `getopt`), см. [Выбор библиотеки разбора аргументов](https://python-all.ru/3.16/library/optparse.html#choosing-an-argument-parser).171172> **См. также**173>174> **Модуль [`optparse`](https://python-all.ru/3.16/library/optparse.html#module-optparse)**175>176> Декларативный разбор опций командной строки.177>178> **Модуль [`argparse`](https://python-all.ru/3.16/library/argparse.html#module-argparse)**179>180> Более строгая библиотека для разбора опций и аргументов командной строки.181