Skip to content

Argparse

https://bip.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/argparse/index.html

https://docs.python.org/3/library/argparse.html

control de argumentos en python.

importando libreria

import argparse

Help

El formateo del help es opcional ya qu se puede dejar en blanco y mostrara solo las opciones de argumentos añadidos, pero ya que lo tenemos lo dejaremos bonito.

prog: nombre del programa

usage : modo de uso

formatter_class=argparse.RawDescriptionHelpFormatter: forzar un formato literal, si no muesta toda la descripción en una línea.

description: descripcion del programa

epilog: Ultima linea que mostrara el help.

parser = argparse.ArgumentParser(
        prog='provando_argparse.py',
        usage='%(prog)s [options]',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description='''
        haciendo pruevas con argparse
        ----------------------------
        Prueva de formato
        literal''',
        epilog="Epilog, es el footer del help"
        )
args = parser.parse_args()
python3 provando_agparse.py -h
usage: provando_argparse.py [options]

        haciendo pruevas con argparse
        ----------------------------
        Prueva de formato
        literal

optional arguments:
  -h, --help  show this help message and exit

Version

parser = argparse.ArgumentParser(
          prog='provando_argparse.py',
          usage='%(prog)s [options]',
          formatter_class=argparse.RawDescriptionHelpFormatter,
          description='''
              haciendo pruevas con argparse
              ----------------------------
              Prueva de formato
              literal''',
          epilog="Epilog, es el footer del help"
 )
parser.add_argument('--version', action='version', version='%(prog)s 1.0')
args = parser.parse_args()

Argumento opcional, único en str

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("-a","--add", help="Detecta y confirma primer argumento")

argumento = analizador.parse_args()

if argumento.add :
    print("Argumento opcional solicitado -a")
    print("Argumento dado: " + argumento.add )

Argumento opcional, unico en int

type permite obligar, que el argumento insertado sea de un tipo o otro.

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("-i","--integer", 
                            help="Detecta y confirma primer argumento integer",
                            type=int)

argumento = analizador.parse_args()

if argumento.integer :
    print("Argumento opcional solicitado -i")
    print("Argumento dado: ", argumento.integer )

Argumento obligatorio

Al añadir un argumento sin el - se convierte en obligatorio, no se podra ejecutar el script sin como minimo 1 argumento.

ej: python3 prog.py file.txt

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("archivo",  help="Argumento obligatorio")

argumento = analizador.parse_args()

if argumento.archivo :
    print("Argumento obligatorio: archivo")
    print("Nombre del archivo: " + argumento.archivo )

Número de argumentos esplicito

nargs permite indicar cuantos argumentos quieres que entren por opción

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("-s","--suma", 
                            help="Suma 2 argumentos numericos",
                            nargs=2,
                            type=int)

argumento = analizador.parse_args()

if argumento.suma :
    print("Argumento opcional solicitado -s")
    print(f"Resultado de {argumento.suma[0]} + {argumento.suma[1]} = {argumento.suma[0] + argumento.suma[1]}")

Número x de argumentos

nargs nos deja jugar con alguna expresión regular por ejemplo.

N The absolute number of arguments (e.g., 3).
? 0 or 1 arguments
* 0 or all arguments
+ Todos, y al menos un argumento.
analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("-l","--lista", 
                            help="Muestra todos los argumentos dados de 0 a n",
                            nargs="*")

argumento = analizador.parse_args()

if argumento.lista :
    print("Argumento opcional solicitado -l")
    print(f"la lista de argumentos es: {argumento.lista}")

Opciones por default

En n argumento obligatorio si le añadimos un valor por defecto, se convierte en, no obligatorio al ya tener un valor predeterminado.

Muy útil para scripts con rutas predeterminadas e indicarle al usuario s quiere otra opcional que la escriba.

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("defecto", 
                            help="Muestra argumento y si no hay muestra el por defecto",
                            nargs="?",
                            default='hola mundo')

argumento = analizador.parse_args()

if argumento.defecto :
    print("Argumento opcional solicitado -d")
    print(f"la lista de argumentos es: {argumento.defecto}")

Opcional en obligatorio

required obliga a que se añada el argumento obligatoriamente.

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("-r","--required", help="Lista los n argumentos dados",
                        required=True, nargs="*")

argumento = analizador.parse_args()

if argumento.required :
    print("Argumento opcional solicitado -r")
    print(f"Argumento dado: {argumento.required}")

Lista opciones de argumento

choices opciones de argumento, solo aceptara esas opciones al argumento indicado.

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument(
                        "mes",
                        choices=['Enero','Abril','Julio','Octubre'],
                        help="Permite escoger un mes de comienzo de trimestre.",
                        )
argumento = analizador.parse_args()

print("Argumento: solicita un mes de una lista predeterminada.")
print("Mes escogido:")
print(argumento.mes)

Verificar opción

action=store_true si la opción a sido añadida retornara un valor de True en el caso contrario False

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
analizador.add_argument("-l","--long", help="Detecta y confirma primer argumento",
                        action = "store_true")
analizador.add_argument("-a","--arbol", help="Detecta y confirma primer argumento",
                        action = "store_true")
argumento = analizador.parse_args()

if argumento.long:
    print("Argumento --long devuelve: " , argumento.long )
if argumento.arbol:
    print("Argumento --arbol devuelve: " , argumento.arbol )

action=count tiene el poder de contar las veces que añades repetidament la opción, utilizado en vervose comunmente -v -vv -vvv

parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
    print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
    print("{}^2 == {}".format(args.square, answer))
else:
    print(answer)

Opciones incompatibles entre ellas

Al crear un grupo de argumentos puedes diferenciar opciones incompatibles, por ejemplo en el siguiente script poedes añadir opción -c o -e pero nunca podras añadir las 2 a la vez.

analizador = argparse.ArgumentParser(description='Tutorial sobre argparse.')
grupo = analizador.add_mutually_exclusive_group()
grupo.add_argument(
  "-c",
  "--cubo",
  action = "store_true",
  help="Imprime un cubo en tercera dimensión.",
)
grupo.add_argument(
  "-e",
  "--esfera",
  action = "store_true",
  help="Imprime una esfera en tercera dimensión.",
)
argumento = analizador.parse_args()
if argumento.cubo:
  print("'Imprime' un cubo")
if argumento.esfera:
  print("'Imprime' una esfera")