Argparse argumentos posicionales opcionales?
Pregunta
Tengo un script que está destinado a ser utilizado como esto:
usage: installer.py dir [-h] [-v]
dir
es un argumento posicional que se define así:
parser.add_argument('dir', default=os.getcwd())
Quiero la dir
a ser opcional: si no se especifica que sólo debe ser cwd
Por desgracia, cuando no se especifica el argumento dir
, consigo Error: Too few arguments
.
Solución
nargs='?'
(o nargs='*'
si va a necesitar más de una dir)
parser.add_argument('dir', nargs='?', default=os.getcwd())
ejemplo extendido:
>>> 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
Otros consejos
Como una extensión a la respuesta @VinaySajip. Hay nargs
adicional vale la pena mencionar .
-
parser.add_argument('dir', nargs=1, default=os.getcwd())
N (un número entero). N argumentos de la línea de comandos serán reunidos en una lista ??p>
-
parser.add_argument('dir', nargs='*', default=os.getcwd())
'*'. Todos los argumentos de línea de comandos presentes se reunieron en una lista. Nota: que generalmente no tiene mucho sentido tener más de un argumento posicional con nargs='*'
, pero varios argumentos opcionales con nargs='*'
es posible.
-
parser.add_argument('dir', nargs='+', default=os.getcwd())
'+'. Al igual que '*', todos los argumentos de línea de comandos presentes se reunieron en una lista. Además, un mensaje de error se genera si no había al menos un argumento de línea de comandos presente.
-
parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
argparse.REMAINDER
. Todos los argumentos de línea de comandos restantes se agrupan en una lista. Esto es comúnmente útil para utilidades de línea de comando que envío a otros utilidades de línea de comando
Si no se proporciona el argumento de palabra clave nargs
, el número de argumentos que se consume es determinada por la acción. Generalmente se producirán este medio se consumirá un solo argumento de línea de comandos y un único punto (no una lista).
Editar (copiado de un comentario de @Acumenus) nargs='?'
Los documentos dicen: '?'. Un argumento será consumido desde la línea de comandos si es posible y produce como un solo elemento. Si no hay ningún argumento de línea de comandos está presente, se producirá el valor de defecto.
parser.add_argument
también tiene un interruptor requerida . Puede utilizar required=False
.
Aquí hay un fragmento de muestra 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()