15.5. getopt – Парсер параметров командной строки¶getopt – Parser for command line options
Этот модуль помогает скриптам разбирать аргументы командной строки в sys.argv. Он поддерживает те же соглашения, что и функция Unix getopt() (включая особое значение аргументов вида ‘-‘ и ‘--‘). Длинные опции, аналогичные тем, что поддерживаются программным обеспечением GNU, также могут использоваться через необязательный третий аргумент.
Более удобная, гибкая и мощная альтернатива – модуль optparse.
Этот модуль предоставляет две функции и одно исключение:
- 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.
Возвращаемое значение состоит из двух элементов: первый – это список пар (option, value); второй – это список аргументов программы, оставшихся после удаления списка опций (это конечный срез 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(err) # выведет что-то вроде "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()
См. также
- Модуль optparse
- Более объектно-ориентированный разбор параметров командной строки.