Argparse argomenti posizionali facoltativi?
Domanda
Ho uno script che è pensato per essere utilizzato in questo modo:
usage: installer.py dir [-h] [-v]
dir
è un argomento posizionale che è definito in questo modo:
parser.add_argument('dir', default=os.getcwd())
Voglio il dir
essere facoltativo: quando non è specificato che dovrebbe essere solo cwd
Purtroppo quando non si specifica l'argomento dir
, ottengo Error: Too few arguments
.
Soluzione
nargs='?'
(o nargs='*'
se si avrà bisogno di più di una dir)
parser.add_argument('dir', nargs='?', default=os.getcwd())
Esempio esteso:
>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]
positional arguments:
dir
optional arguments:
-h, --help show this help message and exit
-v
Altri suggerimenti
Come estensione di @VinaySajip risposta. Ci sono ulteriore nargs
degni di nota .
-
parser.add_argument('dir', nargs=1, default=os.getcwd())
N (un intero). N argomenti dalla riga di comando saranno riuniti in un elenco
-
parser.add_argument('dir', nargs='*', default=os.getcwd())
'*'. Tutti gli argomenti della riga di comando presenti sono raccolti in un elenco. Nota ??strong> che in genere non ha molto senso avere più di un argomento posizionale con nargs='*'
, ma più argomenti opzionali con nargs='*'
è possibile.
-
parser.add_argument('dir', nargs='+', default=os.getcwd())
'+'. Proprio come '*', tutti gli argomenti della riga di comando presenti sono raccolti in un elenco. Inoltre, un messaggio di errore viene generato se non ci fosse almeno un argomento della riga di comando presente.
-
parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
argparse.REMAINDER
. Tutti i restanti argomenti della riga di comando sono raccolti in un elenco. Questo è comunemente utile per utility a riga di comando che inviano ad altri programmi di utilità della riga di comando
Se l'argomento nargs
parola chiave non è previsto, il numero di argomenti consumato è determinato dall'azione. In genere questo significa un unico argomento della riga di comando sarà consumato e un singolo elemento (non una lista) saranno prodotti.
Modifica (copiata da un commento di @Acumenus) nargs='?'
La documentazione dicono: '?'. Un argomento sarà consumato dalla riga di comando, se possibile, e ha prodotto come un unico elemento. Se nessun argomento della riga di comando è presente, il valore di default sarà prodotto.
parser.add_argument
ha anche un interruttore necessario . È possibile utilizzare required=False
.
Ecco un frammento di esempio con Python 2.7:
parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()