2012-10-10 26 views
114

Optparse, la versión anterior simplemente ignora todos los argumentos no reconocidos y continúa. En la mayoría de las situaciones, esto no es ideal y se modificó en argparse. Pero hay algunas situaciones en las que desea ignorar los argumentos no reconocidos y analizar los que ha especificado.Python argparse ignora los argumentos no reconocidos

Por ejemplo:

parser = argparse.ArgumentParser() 
parser.add_argument('--foo', dest="foo") 
parser.parse_args() 

$python myscript.py --foo 1 --bar 2 
error: unrecognized arguments: --bar 

¿Hay alguna forma para sobrescribir esto?

+5

Muy práctico si está escribiendo un contenedor para otro programa, y ​​desea capturar y modificar algunos argumentos, ¡pero pase el resto! –

+0

¡Exactamente por qué terminé aquí @AlanDeSmet! Me alegro de que no estoy tratando de hacer algo loco :) – dwanderson

Respuesta

212

Reemplazar

args = parser.parse_args() 

con

args, unknown = parser.parse_known_args() 

Por ejemplo,

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo') 
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam']) 
print(args) 
# Namespace(foo='BAR') 
print(unknown) 
# ['spam'] 
+9

+1 - no sabía que había algo como 'parse_known_args' – avasal

+2

¡Tampoco yo! Incluso me lo perdí en los documentos http://docs.python.org/library/argparse.html?highlight=argparse#partial-parsing. Gracias – jdborg

+1

Esto surgió al tratar de usar nosetest con parseargs (se negó a permitir que se usen los args nosetest), la razón fue porque estaba haciendo 'parser.parse_args (None)' en lugar de 'parser.parse_args ([])' en mis pruebas –

5

argparse En realidad no todavía "ignorar" _unrecognized_args. Siempre que estos argumentos "no reconocidos" no usen el prefijo predeterminado, no escuchará quejas del analizador.

Utilizando la configuración de @ anutbu pero con el estándar parse.parse_args(), si tuviéramos que ejecutar nuestro programa con los siguientes argumentos.

$ program --foo BAR a b +cd e 

Tendremos esta recopilación de datos de Espacio de nombres para trabajar.

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR') 

Si quisiéramos el prefijo predeterminado - ignorados podríamos cambiar el ArgumentParser y decidir que vamos a utilizar un + para nuestros argumentos "reconocidos" en su lugar.

parser = argparse.ArgumentParser(prefix_chars='+') 
parser.add_argument('+cd') 

El mismo comando producirá

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e') 

poner eso en tu pipa y el humo que =)

nJoy!

14

Puede poner las partes restantes en un nuevo argumento con parser.add_argument('args', nargs=argparse.REMAINDER) si desea utilizarlas.

+0

Esto funciona con 'parse_args()' y no requiere 'parse_known_args()' (en Python 2.7). – OozeMeister

+2

El uso de argparse.REMAINDER parece estar plagado de errores de larga data. Ciertamente no puedo hacer que funcione. parse_known_args() es una buena alternativa. – Matt

+0

Acabo de toparme con un error REMAINDER de larga data hoy: https://bugs.python.org/issue17050 –

Cuestiones relacionadas