getopt.md
1> **Источник:** https://python-all.ru/3.3/library/getopt.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 16.6. [`getopt`](https://python-all.ru/3.3/library/getopt.html#module-getopt) – C-подобный парсер для параметров командной строки89**Исходный код:** [Lib/getopt.py](https://python-all.ru/src/3.3/Lib/getopt.py)1011---1213> **Примечание**14>15> Модуль [`getopt`](https://python-all.ru/3.3/library/getopt.html#module-getopt) – это парсер параметров командной строки, API которого спроектирован так, чтобы быть знакомым пользователям функции C `getopt()`. Пользователи, не знакомые с функцией C `getopt()` или желающие писать меньше кода и получать более качественную справку и сообщения об ошибках, должны рассмотреть использование модуля [`argparse`](https://python-all.ru/3.3/library/argparse.html#module-argparse).1617Этот модуль помогает скриптам разбирать аргументы командной строки в `sys.argv`. Он поддерживает те же соглашения, что и функция Unix `getopt()` (включая особое значение аргументов вида ‘`-`‘ и ‘`--`‘). Длинные опции, аналогичные тем, что поддерживаются программным обеспечением GNU, также могут использоваться через необязательный третий аргумент.1819Этот модуль предоставляет две функции и одно исключение:2021#### `getopt.getopt(args, shortopts, longopts=[])`2223Разбирает параметры командной строки и список параметров. *args* – это список аргументов для разбора, без ведущей ссылки на запущенную программу. Обычно это означает `sys.argv[1:]`. *shortopts* – это строка букв опций, которые скрипт хочет распознать, причем опции, требующие аргумент, сопровождаются двоеточием (`':'`; то есть тот же формат, что использует Unix `getopt()`).2425> **Примечание**26>27> В отличие от GNU `getopt()`, после аргумента, не являющегося опцией, все последующие аргументы также считаются не опциями. Это похоже на то, как работают не-GNU Unix системы.2829*longopts*, если указан, должен быть списком строк с именами длинных опций, которые должны поддерживаться. Символы `'--'` в начале не должны включаться в имя опции. Длинные опции, требующие аргумент, должны сопровождаться знаком равенства (`'='`). Необязательные аргументы не поддерживаются. Чтобы принимать только длинные опции, *shortopts* должна быть пустой строкой. Длинные опции в командной строке могут быть распознаны, если они предоставляют префикс имени опции, который совпадает ровно с одной из принятых опций. Например, если *longopts* равно `['foo', 'frob']`, то опция `--fo` будет соответствовать `--foo`, а `--f` не будет соответствовать однозначно, поэтому будет вызвано исключение [`GetoptError`](https://python-all.ru/3.3/library/getopt.html#getopt.GetoptError).3031Возвращаемое значение состоит из двух элементов: первый – это список пар `(option, value)`; второй – это список аргументов программы, оставшихся после удаления списка опций (это конечный срез *args*). Каждая возвращенная пара «опция-значение» содержит опцию в качестве первого элемента, с префиксом в виде дефиса для коротких опций (например, `'-x'`) или двух дефисов для длинных опций (например, `'--long-option'`), и аргумент опции в качестве второго элемента, либо пустую строку, если опция не имеет аргумента. Опции располагаются в списке в том же порядке, в котором они были найдены, что допускает множественное появление. Длинные и короткие опции могут быть перемешаны.3233#### `getopt.gnu_getopt(args, shortopts, longopts=[])`3435Эта функция работает как [`getopt()`](https://python-all.ru/3.3/library/getopt.html#module-getopt), за исключением того, что по умолчанию используется режим сканирования в стиле GNU. Это означает, что опции и аргументы, не являющиеся опциями, могут перемежаться. Функция [`getopt()`](https://python-all.ru/3.3/library/getopt.html#module-getopt) прекращает обработку опций, как только встречается аргумент, не являющийся опцией.3637Если первый символ строки опций равен `'+'`, или если установлена переменная окружения `POSIXLY_CORRECT`, то обработка опций прекращается, как только встречается аргумент, не являющийся опцией.3839#### `exception getopt.GetoptError`4041Это исключение вызывается, когда в списке аргументов найдена нераспознанная опция или когда опции, требующей аргумента, не предоставлено ни одного. Аргумент исключения – строка, указывающая причину ошибки. Для длинных опций передача аргумента опции, которая его не требует, также вызовет это исключение. Атрибуты `msg` и `opt` содержат сообщение об ошибке и связанную опцию; если нет конкретной опции, к которой относится исключение, `opt` является пустой строкой.4243#### `exception getopt.error`4445Псевдоним для [`GetoptError`](https://python-all.ru/3.3/library/getopt.html#getopt.GetoptError); для обратной совместимости.4647Пример использования только опций в стиле Unix:4849```python50>>> import getopt51>>> args = '-a -b -cfoo -d bar a1 a2'.split()52>>> args53['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']54>>> optlist, args = getopt.getopt(args, 'abc:d:')55>>> optlist56[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]57>>> args58['a1', 'a2']59```6061Использование длинных имён опций так же просто:6263```python64>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'65>>> args = s.split()66>>> args67['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']68>>> optlist, args = getopt.getopt(args, 'x', [69... 'condition=', 'output-file=', 'testing'])70>>> optlist71[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]72>>> args73['a1', 'a2']74```7576В скрипте типичное использование выглядит примерно так:7778```python79import getopt, sys8081def main():82 try:83 opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])84 except getopt.GetoptError as err:85 # вывести справочную информацию и завершить работу:86 print(err) # выведет что-то вроде "option -a not recognized"87 usage()88 sys.exit(2)89 output = None90 verbose = False91 for o, a in opts:92 if o == "-v":93 verbose = True94 elif o in ("-h", "--help"):95 usage()96 sys.exit()97 elif o in ("-o", "--output"):98 output = a99 else:100 assert False, "unhandled option"101 # ...102103if __name__ == "__main__":104 main()105```106107Обратите внимание, что эквивалентный интерфейс командной строки можно создать с меньшим объемом кода и более информативными справкой и сообщениями об ошибках, используя модуль [`argparse`](https://python-all.ru/3.3/library/argparse.html#module-argparse):108109```python110import argparse111112if __name__ == '__main__':113 parser = argparse.ArgumentParser()114 parser.add_argument('-o', '--output')115 parser.add_argument('-v', dest='verbose', action='store_true')116 args = parser.parse_args()117 # ... выполнить какие-то действия с args.output ...118 # ... выполнить какие-то действия с args.verbose ..119```120121> **См. также**122>123> **Модуль [`argparse`](https://python-all.ru/3.3/library/argparse.html#module-argparse)**124>125> Альтернативная библиотека для разбора опций и аргументов командной строки.126