С модулем 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

Только побочный эффект заключается в том, что вы получаете свои аргументы в списке вместо кортежа. Но это может быть легко исправлено, для моего конкретного варианта использования список желателен.

Ответ 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