web-dev-qa-db-fra.com

Argparse arguments de position optionnels?

J'ai un script qui doit être utilisé comme ceci: usage: installer.py dir [-h] [-v]

dir est un argument de position défini comme suit:

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

Je veux que la dir soit optionnelle: quand elle n'est pas spécifiée, elle devrait simplement être cwd.

Malheureusement, lorsque je ne spécifie pas l'argument dir, j'obtiens Error: Too few arguments.

566
Waldo Bronchart

Utilisez nargs='?' (ou _nargs='*'_ si vous aurez besoin de plus d'un répertoire).

_parser.add_argument('dir', nargs='?', default=os.getcwd())
_

exemple étendu:

_>>> 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
_
729
Vinay Sajip

Dans le prolongement de @VinaySajip answer. Il y a en plus nargs qui mérite d'être mentionné .

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

N (un entier). N arguments de la ligne de commande seront rassemblés dans une liste

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

'*' Tous les arguments de ligne de commande présents sont rassemblés dans une liste. Notez qu'il n'est généralement pas logique d'avoir plus d'un argument de position avec nargs='*', mais plusieurs arguments facultatifs avec nargs='*' est possible.

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

'+'. Tout comme '*', tous les arguments de ligne de commande présents sont rassemblés dans une liste. En outre, un message d'erreur sera généré s'il n'y a pas au moins un argument de ligne de commande.

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

argparse.REMAINDER. Tous les arguments de ligne de commande restants sont rassemblés dans une liste. Ceci est généralement utile pour les utilitaires de ligne de commande envoyés à d'autres utilitaires de ligne de commande.

Si l'argument du mot clé nargs n'est pas fourni, le nombre d'arguments utilisés est déterminé par l'action. En règle générale, cela signifie qu'un seul argument de ligne de commande sera utilisé et qu'un seul élément (et non une liste) sera généré.

Éditer (copié d'un commentaire de @Acumenus) nargs='?'La documentation dites: '?'. Un argument sera consommé à partir de la ligne de commande si possible et produit comme un seul élément. Si aucun argument de ligne de commande n'est présent, la valeur par défaut sera générée.

61
Matas Vaitkevicius