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(), после аргумента, не являющегося опцией, все последующие аргументы также считаются не опциями. Это аналогично работе систем Unix, не являющихся GNU.Если указан 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/getopt.html