getopt.md
1> **Источник:** https://python-all.ru/2.7/library/getopt.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 15.6. [`getopt`](https://python-all.ru/2.7/library/getopt.html#module-getopt) – парсер параметров командной строки в стиле C89**Исходный код:** [Lib/getopt.py](https://python-all.ru/src/2.7/Lib/getopt.py)1011---1213> **Примечание**14>15> Модуль [`getopt`](https://python-all.ru/2.7/library/getopt.html#module-getopt) представляет собой парсер опций командной строки, API которого разработан так, чтобы быть знакомым пользователям функции C `getopt()`. Пользователям, не знакомым с функцией C `getopt()` или желающим писать меньше кода и получать лучшие справки и сообщения об ошибках, следует рассмотреть использование модуля [`argparse`](https://python-all.ru/2.7/library/argparse.html#module-argparse).1617Этот модуль помогает сценариям разбирать аргументы командной строки `sys.argv`. Он поддерживает те же соглашения, что и функция Unix `getopt()` (включая особый смысл аргументов вида ‘`-`‘ и ‘`--`‘). Длинные опции, аналогичные поддерживаемым в программном обеспечении GNU, также могут быть использованы с помощью необязательного третьего аргумента.1819Этот модуль предоставляет две функции и одно исключение:2021#### `getopt.getopt(args, options[, long_options])`2223Разбирает опции командной строки и список параметров. *args* – это список аргументов для разбора, без ведущей ссылки на выполняемую программу. Обычно это означает `sys.argv[1:]`. *options* – это строка букв опций, которые сценарий хочет распознать, причём опции, требующие аргумента, сопровождаются двоеточием (`':'`; т.е. тот же формат, что использует Unix `getopt()`).2425> **Примечание**26>27> В отличие от GNU `getopt()`, после неопционного аргумента все последующие аргументы также считаются неопционными. Это аналогично тому, как работают не-GNU Unix-системы.2829*long\_options*, если задан, должен быть списком строк с именами длинных опций, которые должны поддерживаться. Ведущие символы `'--'` не должны включаться в имя опции. Длинные опции, требующие аргумента, должны сопровождаться знаком равенства (`'='`). Необязательные аргументы не поддерживаются. Чтобы принимать только длинные опции, *options* должна быть пустой строкой. Длинные опции в командной строке могут быть распознаны, если они предоставляют префикс имени опции, который соответствует ровно одной из принятых опций. Например, если *long\_options* равно `['foo', 'frob']`, опция `--fo` будет соответствовать `--foo`, но `--f` не будет соответствовать однозначно, поэтому будет возбуждено [`GetoptError`](https://python-all.ru/2.7/library/getopt.html#getopt.GetoptError).3031Возвращаемое значение состоит из двух элементов: первый – список пар `(option, value)`; второй – список аргументов программы, оставшихся после удаления списка опций (это конечный срез *args*). Каждая возвращаемая пара «опция-значение» содержит опцию в качестве первого элемента, с префиксом дефис для коротких опций (например, `'-x'`) или двух дефисов для длинных опций (например, `'--long-option'`), и аргумент опции в качестве второго элемента, или пустую строку, если у опции нет аргумента. Опции располагаются в списке в том же порядке, в котором они были найдены, что допускает повторения. Длинные и короткие опции могут смешиваться.3233#### `getopt.gnu_getopt(args, options[, long_options])`3435Эта функция работает как [`getopt()`](https://python-all.ru/2.7/library/getopt.html#module-getopt), за исключением того, что по умолчанию используется режим сканирования в стиле GNU. Это означает, что опционные и неопционные аргументы могут перемешиваться. Функция [`getopt()`](https://python-all.ru/2.7/library/getopt.html#module-getopt) прекращает обработку опций, как только встречается неопционный аргумент.3637Если первый символ строки опций – `'+'`, или установлена переменная окружения `POSIXLY_CORRECT`, то обработка опций прекращается, как только встречается аргумент, не являющийся опцией.3839Новое в версии 2.3.4041#### `exception getopt.GetoptError`4243Это исключение возбуждается, когда в списке аргументов обнаружена нераспознанная опция или когда опции, требующей аргумента, не передано ни одного. Аргумент исключения – строка, указывающая причину ошибки. Для длинных опций передача аргумента опции, которая его не требует, также вызовет это исключение. Атрибуты `msg` и `opt` содержат сообщение об ошибке и соответствующую опцию; если нет конкретной опции, к которой относится исключение, `opt` является пустой строкой.4445Изменено в версии 1.6: Введён [`GetoptError`](https://python-all.ru/2.7/library/getopt.html#getopt.GetoptError) как синоним для [`error`](https://python-all.ru/2.7/library/getopt.html#getopt.error).4647#### `exception getopt.error`4849Псевдоним для [`GetoptError`](https://python-all.ru/2.7/library/getopt.html#getopt.GetoptError); для обратной совместимости.5051Пример использования только опций в стиле Unix:5253```python54>>> import getopt55>>> args = '-a -b -cfoo -d bar a1 a2'.split()56>>> args57['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']58>>> optlist, args = getopt.getopt(args, 'abc:d:')59>>> optlist60[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]61>>> args62['a1', 'a2']63```6465Использование длинных имён опций так же просто:6667```python68>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'69>>> args = s.split()70>>> args71['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']72>>> optlist, args = getopt.getopt(args, 'x', [73... 'condition=', 'output-file=', 'testing'])74>>> optlist75[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]76>>> args77['a1', 'a2']78```7980В скрипте типичное использование выглядит примерно так:8182```python83import getopt, sys8485def main():86 try:87 opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])88 except getopt.GetoptError as err:89 # вывести справочную информацию и завершить работу:90 print str(err) # выведет что-то вроде "option -a not recognized"91 usage()92 sys.exit(2)93 output = None94 verbose = False95 for o, a in opts:96 if o == "-v":97 verbose = True98 elif o in ("-h", "--help"):99 usage()100 sys.exit()101 elif o in ("-o", "--output"):102 output = a103 else:104 assert False, "unhandled option"105 # ...106107if __name__ == "__main__":108 main()109```110111Обратите внимание, что эквивалентный интерфейс командной строки можно создать с меньшим объёмом кода и более информативными справкой и сообщениями об ошибках, используя модуль [`argparse`](https://python-all.ru/2.7/library/argparse.html#module-argparse):112113```python114import argparse115116if __name__ == '__main__':117 parser = argparse.ArgumentParser()118 parser.add_argument('-o', '--output')119 parser.add_argument('-v', dest='verbose', action='store_true')120 args = parser.parse_args()121 # ... выполнить какие-то действия с args.output ...122 # ... выполнить какие-то действия с args.verbose ..123```124125> **См. также**126>127> **Модуль [`argparse`](https://python-all.ru/2.7/library/argparse.html#module-argparse)**128>129> Альтернативная библиотека для разбора опций и аргументов командной строки.130