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.

È stato utile?

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 .

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

N (un intero). N argomenti dalla riga di comando saranno riuniti in un elenco

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'. Tutti gli argomenti della riga di comando presenti sono raccolti in un elenco. Nota che in genere non ha molto senso avere più di un argomento posizionale con nargs='*', ma più argomenti opzionali con nargs='*' è possibile.

  1. 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.

  1. 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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top