Utilisez nargs='?'
(ou nargs='*'
si vous aurez besoin de plus d'un dir)
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
?
et*
signifient la même chose qu'ils signifient dans les expressions régulières (c.?
-à-d.*
Nécessite 0 ou 1 et 0 ou plus)? Si oui, ça+
marche aussi?+
marche aussi. Voir docs.python.org/2/library/argparse.html#nargs pour les détails.options.dir
, nonargs.dir
, comme j'essayais!En tant qu'extension de la réponse @VinaySajip. Il y en a d'autres qui
nargs
méritent d'être mentionnés .parser.add_argument('dir', nargs=1, default=os.getcwd())
N (un entier). N arguments de la ligne de commande seront regroupés dans une liste
parser.add_argument('dir', nargs='*', default=os.getcwd())
'*'. Tous les arguments de ligne de commande présents sont regroupés dans une liste. Notez qu'il n'a généralement pas beaucoup de sens d'avoir plus d'un argument positionnel avec
nargs='*'
, mais plusieurs arguments optionnels avecnargs='*'
sont possibles.parser.add_argument('dir', nargs='+', default=os.getcwd())
'+'. Tout comme «*», tous les arguments de ligne de commande présents sont regroupés dans une liste. De plus, un message d'erreur sera généré s'il n'y avait pas au moins un argument de ligne de commande présent.
parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
argparse.REMAINDER
. Tous les arguments de ligne de commande restants sont regroupés dans une liste. Ceci est généralement utile pour les utilitaires de ligne de commande qui se répartissent vers d'autres utilitaires de ligne de commandeSi l'
nargs
argument mot - clé n'est pas fourni, le nombre d'arguments consommés est déterminé par l'action. Cela signifie généralement qu'un seul argument de ligne de commande sera consommé et qu'un seul élément (pas une liste) sera produit.Modifier (copié à partir d'un commentaire de @Acumenus)
nargs='?'
Les documents disent: '?'. 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 produite.la source
nargs='?'
cela ne produit pas de liste.Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.
J'espère que cela aide ...nargs
, mais lenargs='?'
définit. Les documents disent: «?». 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 produite.nargs=argparse.REMAINDER
etnargs='*'
, comme il me semble, ils sont identiques dans leur effet (testés en Python 2.7.10 et Python 3.6.1)?parser.add_argument
a également un interrupteur requis . Vous pouvez utiliserrequired=False
. Voici un exemple d'extrait avec Python 2.7:la source