argparse no comprueba los argumentos posicionales

Estoy creando un script que toma argumentos posicionales y opcionales con argparse. He revisado el tutorial de Doug y los Docs de python, pero no puedo encontrar una respuesta.

parser = argparse.ArgumentParser(description='script to run') parser.add_argument('inputFile', nargs='?', type=argparse.FileType('rt'), parser.add_argument('inputString', action='store', nargs='?') parser.add_argument('-option1', metavar='percent', type=float, action='store') parser.add_argument('-option2', metavar='outFile1', type=argparse.FileType('w'), parser.add_argument('-option3', action='store', default='<10', args = parser.parse_args() # rest of script.... blah blah 

Como puede ver, quiero 2 argumentos posicionales y 3 opcionales. Sin embargo, cuando bash ejecutarlo en el terminal, ¡no comprueba los posicionales! Si lo bash: python script.py inputfile se ejecutará normalmente y generará un error a mitad del script cuando no pueda encontrar un valor para inputString. Si lo bash: python script.py xxx; la salida es:

 usage script.py [-h] [-option1] [-option2] [-option3] 

¿Alguien puede explicar por qué no comprueba los argumentos posicionales?

Tu problema es que estás especificando nargs='?' . De la documentación:

'?' . Si es posible, se consumirá un argumento desde la línea de comando y se producirá como un solo elemento. Si no hay ningún argumento de línea de comando, se generará el valor predeterminado.

Si dejas fuera el nargs='?' entonces se requerirá el argumento, y argparse mostrará un error si no se proporciona. Se consume un solo argumento si action='store' (el valor predeterminado).

También puede especificar nargs=1 ; la diferencia es que esto produce una lista que contiene un elemento, a diferencia del elemento en sí. Consulte la documentación para ver más formas de usar nargs .

Funciona para mi.

Código:

 #!/usr/bin/python import argparse parser=argparse.ArgumentParser(description='script to run') parser.add_argument('inputFile', nargs='?', type=argparse.FileType('rt')) parser.add_argument('inputString', action='store', nargs='?') parser.add_argument('-option1', metavar='percent', type=float, action='store') parser.add_argument('-option2', metavar='outFile1', type=argparse.FileType('w')) parser.add_argument('-option3', action='store', default='<10') args = parser.parse_args() 

Ejecución:

 # ./blah.py -h usage: blah.py [-h] [-option1 percent] [-option2 outFile1] [-option3 OPTION3] [inputFile] [inputString] script to run positional arguments: inputFile inputString optional arguments: -h, --help show this help message and exit -option1 percent -option2 outFile1 -option3 OPTION3 

¿Pasaste por alto la segunda línea en la lista de argumentos?

Funciona como se esperaba . No hay inputString si lo ejecuta como script.py inputfile (solo se proporciona un argumento, pero inputString es el segundo argumento).

narg='?' significa que el argumento es opcional (están rodeados por [] en el mensaje de ayuda).