Python: как сделать выбор в optparse?
Я читал это http://docs.python.org/release/2.6.2/library/optparse.html
Но я не настолько ясен, как сделать выбор в optparse?
Я попытался установить "required = 1", но получил ошибку:
Недопустимые аргументы ключевого слова: required
Я хочу, чтобы мой script требовал --file
вариант, который будет вводиться пользователями. Я знаю, что ключевое слово action
дает вам ошибку, если вы не указываете значение --file
, чей action="store_true"
.
Ответы
Ответ 1
Вы можете легко реализовать требуемый вариант.
parser = OptionParser(usage='usage: %prog [options] arguments')
parser.add_option('-f', '--file',
dest='filename',
help='foo help')
(options, args) = parser.parse_args()
if not options.filename: # if filename is not given
parser.error('Filename not given')
Ответ 2
В сообщении справки каждой требуемой переменной Im, вставляющей строку "[ТРЕБУЕМАЯ]" в начале, чтобы пометить ее для последующего анализа, я могу просто использовать эту функцию для ее округления:
def checkRequiredArguments(opts, parser):
missing_options = []
for option in parser.option_list:
if re.match(r'^\[REQUIRED\]', option.help) and eval('opts.' + option.dest) == None:
missing_options.extend(option._long_opts)
if len(missing_options) > 0:
parser.error('Missing REQUIRED parameters: ' + str(missing_options))
parser = OptionParser()
parser.add_option("-s", "--start-date", help="[REQUIRED] Start date")
parser.add_option("-e", "--end-date", dest="endDate", help="[REQUIRED] End date")
(opts, args) = parser.parse_args(['-s', 'some-date'])
checkRequiredArguments(opts, parser)
Ответ 3
Так как if not x
не работает
для некоторых (отрицательных, нулевых) параметров,
и предотвратить множество тестов,
я предпочитаю что-то вроде этого:
required="host username password".split()
parser = OptionParser()
parser.add_option("-H", '--host', dest='host')
parser.add_option("-U", '--user', dest='username')
parser.add_option("-P", '--pass', dest='password')
parser.add_option("-s", '--ssl', dest='ssl',help="optional usage of ssl")
(options, args) = parser.parse_args()
for r in required:
if options.__dict__[r] is None:
parser.error("parameter %s required"%r)
Ответ 4
Я вынужден использовать python 2.6 для нашего решения, поэтому я придерживаюсь модуля optparse.
Вот решение, которое я нашел, чтобы проверить необходимые параметры, которые работают без указания второго списка необходимых параметров. Таким образом, при добавлении новой опции вам не нужно добавлять это имя в список параметров для проверки.
Мои критерии для требуемой опции - значение параметра должно быть не None, и эти параметры не имеют значения по умолчанию (пользователь не указал add_option (default = "...",...).
def parse_cli():
"""parse and check command line options, shows help message
@return: dict - options key/value
"""
import __main__
parser = OptionParser(description=__main__.__doc__)
parser.add_option("-d", "--days", dest="days",
help="Number of days to process")
parser.add_option("-p", "--period", dest="period_length",default="2",
help="number or hours per iteration, default value=%default hours")
(options, args) = parser.parse_args()
"""get dictionary of options' default values.
in this example: { 'period_length': '2','days': None}"""
defaults = vars(parser.get_default_values())
optionsdict = vars(options)
all_none = False
for k,v in optionsdict.items():
if v is None and defaults.get(k) is None:
all_none = True
if all_none:
parser.print_help()
sys.exit()
return optionsdict
Ответ 5
Текущий ответ с наибольшим количеством голосов не будет работать, если, например, аргумент был целым числом или float, для которого нулевой допустимый ввод. В этих случаях он сказал бы, что есть ошибка. Альтернативой (добавить к нескольким другим здесь) будет, например,
parser = OptionParser(usage='usage: %prog [options] arguments')
parser.add_option('-f', '--file', dest='filename')
(options, args) = parser.parse_args()
if 'filename' not in options.__dict__:
parser.error('Filename not given')
Ответ 6
Я также застрял на python 2.6 (pining для python2.7 и argparse, который имеет не только необходимые аргументы, но и позволяет указать, что должен быть поставлен один из набора); мой подход требует второго прохода, но позволяет мне запрашивать отсутствующие аргументы, если не работает в пакетном режиме:
# from myscript
import helpers
import globalconfig
parser = optparse.OptionParser(usage=myheader,epilog=myfooter)
parser.add_option("-L","--last",
action="store",dest="last_name",default="",
help="User last (family) name; prompted for if not supplied"
)
parser.add_option("-y","--yes",
action="store_true",dest="batch_flag",default=False,
help="don't prompt to confirm actions (batch mode)"
)
[...]
(options, args) = parser.parse_args()
globalconfig.batchmode = options.batch_flag
[...]
last = prompt_if_empty(options.last_name,
"Last name (can supply with \"-L\" or \"--last\" option):")
# from helpers.py
def prompt_if_empty(variable,promptstring):
if not variable:
if globalconfig.batchmode:
raise Exception('Required variable missing.')
print "%s" %promptstring
variable = raw_input(globalconfig.prompt)
return variable
(Я думаю о создании собственного класса парсера, который имеет общие параметры для глобальных конфигураций, испеченных в.)
Еще один ответ на этот вопрос привел parser.error, с которым я не знаком, когда писал код, но, возможно, был лучшим выбором.
Ответ 7
Поскольку модуль optparse устарел с версии 2.7, вы, вероятно, найдете несколько более свежих примеров здесь: Пример простого простого примера argparse: 1 аргумент, 3 результата
Ответ 8
Существует как минимум два метода реализации требуемых параметров с optparse
. Как указано на странице docs, optparse не мешает вам выполнять требуемые параметры, но не дает вам большой помощи в это тоже. Ниже приведены примеры, найденные в файлах, распространяемых вместе с источником.
Обратите внимание, что optparse
module устарел с версии 2.7 и не будет развиваться дальше. Вместо этого следует использовать argparse
module.
Версия 1: добавьте метод в OptionParser, какие приложения должны вызывать после разбора аргументов:
import optparse
class OptionParser (optparse.OptionParser):
def check_required (self, opt):
option = self.get_option(opt)
# Assumes the option 'default' is set to None!
if getattr(self.values, option.dest) is None:
self.error("%s option not supplied" % option)
parser = OptionParser()
parser.add_option("-v", action="count", dest="verbose")
parser.add_option("-f", "--file", default=None)
(options, args) = parser.parse_args()
print "verbose:", options.verbose
print "file:", options.file
parser.check_required("-f")
Источник: docs/lib/required_1.txt
Версия 2: Расширьте опцию и добавьте требуемый атрибут; добавьте OptionParser для обеспечения наличия необходимых параметров после разбора:
import optparse
class Option (optparse.Option):
ATTRS = optparse.Option.ATTRS + ['required']
def _check_required (self):
if self.required and not self.takes_value():
raise OptionError(
"required flag set for option that doesn't take a value",
self)
# Make sure _check_required() is called from the constructor!
CHECK_METHODS = optparse.Option.CHECK_METHODS + [_check_required]
def process (self, opt, value, values, parser):
optparse.Option.process(self, opt, value, values, parser)
parser.option_seen[self] = 1
class OptionParser (optparse.OptionParser):
def _init_parsing_state (self):
optparse.OptionParser._init_parsing_state(self)
self.option_seen = {}
def check_values (self, values, args):
for option in self.option_list:
if (isinstance(option, Option) and
option.required and
not self.option_seen.has_key(option)):
self.error("%s not supplied" % option)
return (values, args)
parser = OptionParser(option_list=[
Option("-v", action="count", dest="verbose"),
Option("-f", "--file", required=1)])
(options, args) = parser.parse_args()
print "verbose:", options.verbose
print "file:", options.file
Источник: docs/lib/required_2.txt
Ответ 9
Я бы использовал библиотеку argparse, в которую встроена эта функциональность:
PARSER.add_argument("-n", "--namespace", dest="namespace", required=True,
help="The path within the repo to the data base")
ссылка argparse