Есть ли в любом случае, чтобы убедить Getopt от Python обрабатывать дополнительные параметры с параметрами?
-
20-09-2019 - |
Вопрос
Согласно документации на Python's getopt
(Я думаю) Поля вариантов должны вести себя как getopt()
функция Однако, кажется, я не могу включить дополнительные параметры для моего кода:
#!/usr/bin/python
import sys,getopt
if __name__ == "__main__":
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
except getopt.GetoptError, err:
print str(err)
sys.exit(1)
for o,a in opts:
if o in ("-v", "--verbose"):
if a:
verbose=int(a)
else:
verbose=1
print "verbosity is %d" % (verbose)
Результаты:
$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
Решение
getopt
не поддерживает дополнительные параметры. В случае длительного варианта вы можете сделать:
$ ./testopt.py --verbose=
что приведет к значению пустой строки.
Вы могли бы найти argparse
модуль, чтобы быть более гибким.
Другие советы
К сожалению, нет никакого пути. От OptParse Docs:
Как правило, заданный вариант либо принимает аргумент, либо нет. Многие люди хотят функцию «необязательные аргументы», а это означает, что некоторые варианты будут принимать аргумент, если они увидят это, и не будут, если они этого не сделают. Это несколько противоречиво, потому что он делает расстановку неоднозначным: если «-a» принимает необязательный аргумент, а «-b»-это еще один вариант, как мы интерпретируем «-ab»? Из -за этой двусмысленности OptParse не поддерживает эту функцию.
РЕДАКТИРОВАТЬ: Ой, то есть для модуля OptParse, а не модуля getopt, но рассуждения, почему ни один модуль не имеет «необязательных аргументов опции», одинакова для обоих.
Вы можете сделать дополнительный параметр с Getopt, как это:
import getopt
import sys
longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)
if argDict.has_key('--env') and argDict['--env'] == 'prod':
print "production"
else:
print "sandbox"
Применение:
$ python scratch.py --env=prod
production
$ python scratch.py --env=dev
sandbox
$ python scratch.py
sandbox
Если вы используете версию 2.3 или позже, вы можете попробовать OptParse Вместо этого модуль, так как он «более удобный, гибкий и мощный ...», а также новее. Увы, как ответил Пинт, кажется, что невозможно получить именно то, что вы хотите.
python's getopt should really support optional args, like GNU getopt by requiring '=' be used when specifying a parameter. Now you can simulate it quite easily though, with this constraint by implicitly changing --option to --option=
I.E. you can specify that --option requires an argument, and then adjust --option to --option= as follows:
for i, opt in enumerate(sys.argv):
if opt == '--option':
sys.argv[i] = '--option='
elif opt == '--':
break