2012-08-01 19 views
16

ho un seguente codice in Python:argomenti argparse nidificano

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') 

Il mio problema è con l'opzione "--web_port". Voglio essere in grado di aggiungere questa opzione solo con l'opzione "-a" ma non con "-u".

I voglio essere in grado di eseguire: "python my_script.py -a nome --web_port = XXXX".

mi non voglio per essere in grado di eseguire: "python my_script.py -u nome --web_port = XXXX"

Come dovrei cambiare il mio codice in modo da essere in grado di eseguire in questo modo?

Grazie, Arshavski Alexander.

+0

possibile duplicato di [python, argparse: abilita il parametro di input quando ne è stato specificato un altro] (http://stackoverflow.com/questions/11455218/python-argparse-enable-input-parameter-when-another-one- è stato specificato) – mgilson

risposta

27

Invece di avere -a e -u opzioni, è possibile che si desideri rendere i sottocomandi. Poi, fare --web-port un'opzione del add sottocomando:

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

Qualcosa di simile:

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") 
... 

Se si tenta di eseguire

my_script.py upgrade name --web_port=1234 

si otterrà un errore per argomento non riconosciuto "- -web_port".

Allo stesso modo, se si tenta

my_script.py add name upgrade 

si otterrà un errore per argomento non riconosciuto "upgrade", dal momento che è stato definito solo un singolo argomento posizionale per 'aggiungi' sottocomando.

In altre parole, i sottocomandi sono implicitamente mutuamente esclusivi. L'unica verruca piccola è che è necessario aggiungere il parametro posizionale "nome" a ciascun sottodirer .

+0

Grazie per la risposta veloce. Ma ho bisogno di aggiungere e aggiornare per escludermi a vicenda. – alexarsh

+1

Come sottocomandi, sarebbero. 'python my_script.py add name --web_port = XXX upgrade', ad esempio, considera' upgrade' come argomento posizionale al sottocomando 'add', non una chiamata al sottocomando' upgrade'. (Penso, non ho implementato i sottocomandi in un istante.) – chepner

+1

Grazie mille. Quello è ciò di cui ho bisogno. – alexarsh

Problemi correlati