getopt
— Синтаксический анализатор в стиле C для параметров командной строки¶
Исходный код: Lib/getopt.py
Примечание
Модуль getopt
представляет собой синтаксический анализатор параметров командной строки, API которого разработан таким образом, чтобы быть знакомым пользователям функции C getopt()
. Пользователям, которые не знакомы с функцией C:c:func: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
.Возвращаемое значение состоит из двух элементов: первый - это список пар
(option, value)
; второй - список аргументов программы, оставшихся после удаления списка опций (это завершающий фрагмент args). Каждая возвращаемая пара параметров и значений содержит параметр в качестве первого элемента, с префиксом дефиса для коротких параметров (например,'-x'
) или двумя дефисами для длинных параметров (например,,'--long-option'
), и аргументом option в качестве второго элемента, или пустая строка, если параметр не имеет аргумента. Параметры отображаются в списке в том же порядке, в каком они были найдены, что позволяет использовать их повторно. Длинные и короткие опционы могут быть смешанными.
- getopt.gnu_getopt(args, shortopts, longopts=[])¶
Эта функция работает как
getopt()
, за исключением того, что по умолчанию используется режим сканирования в стиле GNU. Это означает, что аргументы option и non-option могут быть перемешаны. Функцияgetopt()
прекращает обработку параметров, как только встречается аргумент, не содержащий параметра.Если первый символ строки параметра равен
'+'
или если задана переменная окруженияPOSIXLY_CORRECT
, то обработка параметра прекращается, как только встречается аргумент, не относящийся к параметру option.
- exception getopt.GetoptError¶
Это происходит, когда в списке аргументов обнаруживается нераспознанный параметр или когда параметру, требующему указания аргумента, не присвоено значение none. Аргументом для исключения является строка, указывающая причину ошибки. Для длинных опций аргумент, указанный для опции, которая не требует этого параметра, также приведет к возникновению этого исключения. Атрибуты
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 ..
См.также
- Модуль
argparse
Альтернативный параметр командной строки и библиотека анализа аргументов.