С модулем optparse Python, как вы создаете опцию, которая принимает переменное количество аргументов?
С Perl Getopt::Long
можно легко определить параметры командной строки, которые принимают переменное количество аргументов:
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
есть ли способ сделать это непосредственно с помощью Python optparse
модуль? Насколько я могу судить,nargs
атрибут option можно использовать для указания фиксированного количества аргументов option, и я не видел других альтернатив в документации.
6 ответов
Я считаю optparse
не поддерживает то, что вам требуется (не напрямую-как вы заметили, вы можете сделать это, если вы готовы выполнить всю дополнительную работу обратного вызова!-). Вы также можете сделать это проще всего с помощью стороннего расширения argparse, который поддерживает переменное число аргументов (а также добавляет несколько других удобных функций).
этот URL-адрес документы argparse
' s add_argument
-- passing nargs='*'
дает возможность принимать ноль или более аргументы, '+'
позволяет ей принимать один или несколько аргументов и т. д.
Мне потребовалось некоторое время, чтобы понять, но вы можете использовать действие обратного вызова для своих опций, чтобы это сделать. Проверьте, как я хватаю произвольное количество args к флагу "--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
единственный побочный эффект заключается в том, что вы получаете свои args в списке вместо кортежа. Но это можно легко исправить, для моего конкретного случая использования списка желательно.
недавно у меня была эта проблема: я был на Python 2.6 и нуждался в опции, чтобы взять переменное количество аргументов. Я попытался использовать решение Дэйва, но обнаружил, что оно не будет работать без явной установки 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_args-это функция, которую нужно вызвать вместо setattr.
вот один из способов: возьмите строку генерации fileLst в качестве строки, а затем используйте http://docs.python.org/2/library/glob.html чтобы сделать расширение ugh, это может не работать, не избегая *
на самом деле, есть лучший способ: python myprog.py -V-L 1000 / главная / Доминик / радар/*.json
parser, opts = parse_args ()
inFileLst = парсер.Ларгс!--3-->