Argparse argumentos posicionales opcionales?


Tengo un script que está destinado a ser usado así: usage: installer.py dir [-h] [-v]

dir es un argumento posicional que se define así:

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

Quiero que el dir sea opcional: cuando no se especifica debería ser simplemente cwd.

Desafortunadamente cuando no especifico el argumento dir, obtengo Error: Too few arguments.

Author: wOxxOm, 2010-12-18

3 answers

Uso nargs='?' (o nargs='*' si necesita más de un 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
 634
Author: Vinay Sajip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-02 08:30:05

Como una extensión de la respuesta @VinaySajip. Hay nargs adicionales que vale la pena mencionar.

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

N (un entero). N argumentos de la línea de comandos se reunirán en una lista

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

'*'. Todos los argumentos de la línea de comandos presentes se reúnen en una lista. Tenga en cuenta que generalmente no tiene mucho sentido tener más de un argumento posicional con nargs='*', pero múltiples argumentos opcionales con nargs='*' es posible.

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

'+'. Al igual que '*', todos los argumentos de línea de comandos presentes se reúnen en una lista. Además, se generará un mensaje de error si no había al menos un argumento de línea de comandos presente.

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

argparse.REMAINDER. Todos los argumentos de línea de comandos restantes se reúnen en una lista. Esto es comúnmente útil para utilidades de línea de comandos que se envían a otras utilidades de línea de comandos

Si la palabra clave nargs no se proporciona argumento, el número de argumentos consumidos está determinado por la acción. Generalmente esto significa que se consumirá un solo argumento de línea de comandos y se producirá un solo elemento (no una lista).

 45
Author: Matas Vaitkevicius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-06 10:11:40

parser.add_argument también tiene un interruptor requerido. Puedes usar 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()
 -5
Author: rakhee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-19 10:34:21