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 — строка символов опций, которые скрипт хочет распознать, опции, требующие аргумента, следуют за двоеточием (':'; т.е., тот же формат, что использует Unixgetopt()).Примечание
В отличие от 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 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 ..
См. также
-
Moduleargparse -
Альтернативная библиотека парсинга аргументов командной строки.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/getopt.html