2015-02-20 15 views
8

Desidero specificare un argomento obbligatorio chiamato inputdir ma vorrei anche avere una versione abbreviata denominata i. Non vedo una soluzione concisa per farlo senza fare entrambi gli argomenti opzionali e quindi fare il mio controllo. C'è una pratica preferita per questo che non sto vedendo o l'unico modo è quello di rendere entrambi opzionali e fare la mia gestione degli errori?Come creare una versione breve e lunga di un argomento richiesto usando Python Argparse?

Ecco il mio codice:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("inputdir", help="Specify the input directory") 
parser.parse_args() 

risposta

11

Per bandiere (opzioni che iniziano con - o --) passano nelle opzioni con le bandiere. È possibile specificare più opzioni:

parser.add_argument('-i', '--inputdir', help="Specify the input directory") 

Vedere il name or flags option documentation:

Il metodo add_argument() deve sapere se un argomento opzionale, come -f o --foo, o un argomento posizionale, come una lista di nomi di file, è previsto. I primi argomenti passati a add_argument() devono quindi essere una serie di flag o un semplice nome di argomento.

Demo:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-i', '--inputdir', help="Specify the input directory") 
_StoreAction(option_strings=['-i', '--inputdir'], dest='inputdir', nargs=None, const=None, default=None, type=None, choices=None, help='Specify the input directory', metavar=None) 
>>> parser.print_help() 
usage: [-h] [-i INPUTDIR] 

optional arguments: 
    -h, --help   show this help message and exit 
    -i INPUTDIR, --inputdir INPUTDIR 
         Specify the input directory 
>>> parser.parse_args(['-i', '/some/dir']) 
Namespace(inputdir='/some/dir') 
>>> parser.parse_args(['--inputdir', '/some/dir']) 
Namespace(inputdir='/some/dir') 

Tuttavia, il primo elemento di richiesti argomenti è solo un segnaposto. Le opzioni - e -- sono sempre opzionale (che è la convenzione della riga di comando), gli argomenti obbligatori non vengono mai specificati con tali opzioni. Invece la guida della riga di comando mostrerà dove mettere gli argomenti richiesti con un segnaposto basato sul primo argomento passato a add_argument(), che deve essere passato senza trattini.

Se si deve rompere con tale convenzione e utilizzare un argomento a partire - o -- che è necessario in ogni caso , dovrete fare il proprio controllo:

args = parser.parse_args() 
if not args.inputdir: 
    parser.error('Please specify an inputdir with the -i or --inputdir option') 

Qui il parser.error() method stamperà le informazioni di aiuto insieme al tuo messaggio di errore, quindi esci.

+0

Grazie mille per il chiarimento! Apprezzo molto il tuo aiuto. – user3621633

+0

La cosa che non mi piace, è che quando stampa l'uso, non stampa '-i' e' --inputdir'. Vorrei che l'uso fosse qualcosa come 'usage: [-h] [-i | --inputdir INPUTDIR]'; qualcosa in tal senso. Probabilmente un modo per farlo è usare 'add_mutually_exclusive_group()', ma a me sembra un po 'hacky. Mi chiedo se c'è un modo migliore. – searchengine27

+0

@ searchengine27: dovrei personalizzare [help formatter class] (https://docs.python.org/2/library/argparse.html#formatter-class), temo. –

Problemi correlati