Question Argparse arguments de position optionnels?


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

dir est un argument positionnel qui est défini comme ceci:

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

je veux le dir être facultatif: quand il n'est pas spécifié, il devrait juste être cwd.

Malheureusement quand je ne spécifie pas le dir argument, je reçois Error: Too few arguments.


472
2017-12-18 20:45


origine


Réponses:


Utilisation 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

615
2017-12-18 21:15



Comme une extension à @VinaySajip réponse. Il y a d'autres nargs à noter.

  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 regroupés dans une liste. Remarque que cela n'a généralement pas beaucoup de sens d'avoir plus d'un argument de position avec nargs='*', mais plusieurs arguments optionnels 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 regroupé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 présent.

  1. 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 sont envoyés à d'autres utilitaires de ligne de commande

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


42
2017-07-06 10:11



parser.add_argument a aussi un interrupteur Champs obligatoires. Vous pouvez utiliser required=False. Voici un extrait de code avec 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()

-4
2017-12-01 21:15