С модулем optparse Python, как вы создаете параметр, который принимает переменное количество аргументов?
С Perl Getopt::Long
вы можете легко определить параметры командной строки, которые принимают переменное количество аргументов:
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
Есть ли способ сделать это напрямую с помощью модуля Python optparse
? Насколько я могу судить, атрибут параметра nargs
может использоваться для указания фиксированного количества аргументов параметра, и я не видел других альтернатив в документации.
Ответы
Ответ 1
Я считаю, что optparse
не поддерживает то, что вам нужно (не напрямую - как вы заметили, вы можете сделать это, если хотите сделать всю дополнительную работу обратного вызова!). Вы также можете сделать это наиболее просто с сторонним расширением argparse, который поддерживает переменные числа аргументов (а также добавляет несколько других удобных бит функциональности).
Этот URL document argparse
add_argument
- передача nargs='*'
позволяет опции принимать ноль или более аргументов, '+'
позволяет он принимает один или несколько аргументов и т.д.
Ответ 2
Мне потребовалось немного времени, чтобы выяснить, но вы можете использовать действие обратного вызова для своих вариантов, чтобы это сделать. Оформить заказ, как я беру произвольное количество аргументов в флаг "-file" в этом примере.
from optparse import OptionParser,
def cb(option, opt_str, value, parser):
args=[]
for arg in parser.rargs:
if arg[0] != "-":
args.append(arg)
else:
del parser.rargs[:len(args)]
break
if getattr(parser.values, option.dest):
args.extend(getattr(parser.values, option.dest))
setattr(parser.values, option.dest, args)
parser=OptionParser()
parser.add_option("-q", "--quiet",
action="store_false", dest="verbose",
help="be vewwy quiet (I'm hunting wabbits)")
parser.add_option("-f", "--filename",
action="callback", callback=cb, dest="file")
(options, args) = parser.parse_args()
print options.file
print args
Только побочный эффект заключается в том, что вы получаете свои аргументы в списке вместо кортежа. Но это может быть легко исправлено, для моего конкретного варианта использования список желателен.
Ответ 3
Моя ошибка: просто нашла этот Обратный Образец 6.
Ответ 4
Разве вам не было бы лучше с этим?
foo.pl --files a.txt,b.txt,c.txt --verbose
Ответ 5
У меня недавно была эта проблема: я был на Python 2.6 и мне нужно было выбрать переменное количество аргументов. Я попытался использовать решение Dave, но обнаружил, что это не сработает, не указывая явно на Nargs на 0.
def arg_list(option, opt_str, value, parser):
args = set()
for arg in parser.rargs:
if arg[0] == '-':
break
args.add(arg)
parser.rargs.pop(0)
setattr(parser.values, option.dest, args)
parser=OptionParser()
parser.disable_interspersed_args()
parser.add_option("-f", "--filename", action="callback", callback=arg_list,
dest="file", nargs=0)
(options, args) = parser.parse_args()
Проблема заключалась в том, что по умолчанию предполагается, что новая опция, добавленная add_options, имеет nargs = 1, а когда nargs > 0 OptionParser будет вытеснять элементы из rargs и назначать их значения до вызова вызываемых вызовов. Таким образом, для опций, которые не указывают nargs, rargs всегда будет отключен на один к моменту вызова вашего callback.
Этот обратный вызов можно использовать для любого количества параметров, просто callback_args будет функцией, которая будет вызываться вместо setattr.
Ответ 6
Здесь один из способов: Возьмите строку fileLst, генерирующую строку, в качестве строки, а затем используйте http://docs.python.org/2/library/glob.html, чтобы сделать расширение, но это может не сработать не ускользая от *
Собственно, получилось лучше:
python myprog.py -V -l 1000/home/dominic/radar/*.json < - Если это ваша командная строка
parser, opts = parse_args()
inFileLst = parser.largs