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.

¿Fue útil?

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 .

  1. 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

  1. 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.

  1. 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.

  1. 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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top