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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/getopt.html