Модуль getopt
помогает скриптам Python анализировать аргументы командной строки, возвращаемые функцией sys.argv()
.
Он поддерживает те же соглашения, что и функция getopt()
в Unix, включая специальные значения аргументов в форме '-'
и '--'
. Длинные параметры, подобные тем, которые поддерживаются программным обеспечением GNU, также могут использоваться через необязательный третий аргумент.
Этот модуль предоставляет две функции и одно исключение.
Примечание. Модуль getopt
- это синтаксический анализатор параметров командной строки, API которого разработан в стиле функции языка C getopt()
. Пользователи, которые не знакомы с функцией C getopt()
или хотели бы писать меньше кода и получать более качественную подсказку и сообщения об ошибках, должны рассмотреть возможность использования модуля argparse
.
getopt
:Пример использования только параметров в стиле 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']
Использование длинных имен опций:
>>> import getopt >>> 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(err) # выведет что-то вроде "option-a not recognized" # показать справку и выйти # `usage()` здесь не определена # 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, "необработанный вариант" 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() # ... делать что-нибудь с args.output ... # ... делать что-нибудь с args.verbose ..