С модулем 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 в списке вместо кортежа. Но это можно легко исправить, для моего конкретного случая использования списка желательно.


моя ошибка: только что нашел это Обратный Вызов Пример 6.


не будет ли вам лучше с этим?

foo.pl --files a.txt,b.txt,c.txt --verbose

недавно у меня была эта проблема: я был на 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-->