Niedawno miałem ten problem osobiście: byłem na Pythonie 2.6 i potrzebowałem opcji, aby pobrać zmienną liczbę argumentów. Próbowałem użyć rozwiązanie Dave'a, ale okazało się, że nie będzie działać bez również wyraźnie określających 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()
Problemem było to, że domyślnie zakłada się nowa opcja dodana przez add_options mieć nargs = 1 i gdy nargs> 0 OptionParser wyskoczy przedmioty z rargs i przypisze je do wartości przed wywołaniem wywołań zwrotnych. Tak więc, dla opcji, które nie określają nargs, rargs będzie zawsze wyłączony o jeden do czasu wywołania callback.
To wywołanie zwrotne może być używane dla dowolnej liczby opcji, po prostu wywołaj funkcję callback jako funkcję, która ma zostać wywołana zamiast setattr.
Określ nazwy plików za pomocą argumentów, nie poprzez opcję: 'foo.pl a.txt b.txt c.txt --verbose' Nazwy plików będą umieszczane w argach w tym przypadku. – jfs
Jeśli --file definiuje dane wejściowe, takie podejście nie jest zalecane. –