2012-08-01 18 views
16

tengo un siguiente código en Python:argumentos argparse anidan

parser = argparse.ArgumentParser(description='Deployment tool') 
group = parser.add_mutually_exclusive_group() 
group.add_argument('-a', '--add', dest='name_to_add', help='Add a new group or a role to existing group') 
group.add_argument('-u', '--upgrade', dest='name_to_upgrade', help='Upgrade a group with the new version') 
parser.add_argument('--web_port', help='Port of the WEB instance that is being added to the group') 

Mi problema es con la opción "--web_port". Quiero poder agregar esta opción solo con la opción "-a" pero no con "-u".

I quiero para poder ejecutar: "python my_script.py -a name --web_port = XXXX".

I no quiero a ser capaz de ejecutar: "pitón my_script.py -u nombre --web_port = XXXX"

¿Cómo debo cambiar mi código con el fin de ser capaz de ejecutar esta ¿camino?

Gracias, Arshavski Alexander.

+0

posible duplicado de [python, argparse: habilitar el parámetro de entrada cuando se ha especificado otro]] (http://stackoverflow.com/questions/11455218/python-argparse-enable-input-parameter-when-another-one- has-been-specified) – mgilson

Respuesta

27

En lugar de tener -a y -u ser opciones, es posible que desee hacer que los subcomandos. A continuación, hacer --web-port una opción de la add subcomando:

python my_script.py add name --web_port=XXXX 
python my_script.py upgrade name 

Algo así como:

parser = argparse.ArgumentParser(description='Deployment tool') 
subparsers = parser.add_subparsers() 

add_p = subparsers.add_parser('add') 
add_p.add_argument("name") 
add_p.add_argument("--web_port") 
... 

upg_p = subparsers.add_parser('upgrade') 
upg_p.add_argument("name") 
... 

Si intenta ejecutar

my_script.py upgrade name --web_port=1234 

obtendrá un error de argumento no reconocido "- -web_port ".

Del mismo modo, si se intenta

my_script.py add name upgrade 

obtendrá un error de argumento no reconocido "actualización", ya que sólo se definido un solo argumento posicional para el subcomando 'añadir'.

En otras palabras, los subcomandos son implícitamente mutuamente excluyentes. La única verruga minúscula es que debe agregar el parámetro posicional "nombre" a cada subparser .

+0

Gracias por la respuesta rápida. Pero necesito agregar y actualizar para ser mutuamente exclusivo. – alexarsh

+1

Como subcomandos, lo serían. 'python my_script.py add name --web_port = XXX upgrade', por ejemplo, trataría' upgrade' como un argumento posicional al subcomando 'add', no una invocación del subcomando' upgrade'. (Creo que, no he implementado subcomandos en un tiempo.) – chepner

+1

Muchas gracias. Eso es lo que necesito. – alexarsh

Cuestiones relacionadas