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.Результат состоит из двух элементов: первый — список пар «опция-значение»; второй — список аргументов программы, оставшихся после удаления списка опций (это конечный срез 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/getopt.html