Recientemente tuve este problema: estaba en Python 2.6 y necesitaba una opción para tomar una cantidad variable de argumentos. He intentado utilizar la solución de Dave, pero descubrí que no funcionaría sin nargs también establecer explícitamente a 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()
El problema era que, por defecto, una nueva opción añadida por add_options se supone que tiene nargs = 1 y cuando nargs> 0 OptionParser sacará objetos de rargs y los asignará al valor antes de llamar a cualquier devolución de llamada. Por lo tanto, para las opciones que no especifiquen nargs, los rargs siempre estarán desactivados en uno para cuando se llame su devolución de llamada.
Esta devolución de llamada se puede utilizar para cualquier cantidad de opciones, solo tiene que llamar a callback_args para llamar a la función en lugar de setattr.
Especifique los nombres de archivo mediante argumentos, no mediante la opción: 'foo.pl a.txt b.txt c.txt --verbose' Los nombres de archivo se pondrían en args en este caso. – jfs
Si --files define las entradas, este enfoque no es recomendable. –