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.10/library/getopt.html