Ejecutar python con argparse

En este post describo cómo ejecutar un script python con argumentos desde el cmd, usando argparse. Mostraré varios ejemplos para comprender el funcionamiento. También puedes revisar otras formas de ejecutar scripts python

Argparse

Es un módulo que forma parte de la biblioteca estandar python para analizar argumentos enviados desde la línea de comandos. Argparse es un analizador sintáctico, usaré el término parser para referirme al analizador sintáctico como muestra en su documentación oficial.

Argparse – python

Consideremos 4 puntos importantes para empezar a usar argparse

  1. import argparse
  2. parser = argparse.ArgumentParser(), Crear un objeto de ArgumentParser llamado parser:
  3. parser.add_argument(), Añadir argumentos a parser
  4. args = parser.parse_args(), Analizar argumentos:

Nota: Los códigos en todo el post se ejecutan con python 3

Ejemplo1 – argparse

El ejemplo1, imprime exactamente lo mismo que ingresas como argumento, igual que en Gif 2 ¡Veámos como va!

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("texto")
args = parser.parse_args()
#Imprimir en el terminal el resultado
print(args.texto)

Guardo el anterior código con el nombre ejemplo1.py y en la terminal ejecuto el script añadiendo cualquier caracter o texto como augumento (mi texto es “Hola_kipuna”), así:

kipuna@kipuna:~/Escritorio$ python3 ejemplo1.py Hola_kipuna

¡El ejemplo1 fue sencillo!, pero argparse es mucho mas que eso 😀

Ejemplo2 – argparse

En este ejemplo2 añadiremos dos argumentos en la linea de comandos (Tu nombre y un número para obtener el valor al cuadrado).

Nota: Mientras avance con los ejemplos iré añadiendo más parámetros a el método add_argument(), aquí en este ejemplo añadimos el tipo de dato.

Tipo de dato

Además de añadir un nuevo argumento "x" , especifico el tipo de dato (type) al que debe convertirse el argumento de la línea de comandos.

  • nombre es de tipo str
  • x es de tipo float
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("nombre", type = str)
parser.add_argument("x", type = float)
args = parser.parse_args()

print('Hola,',args.nombre,'! El valor al cuadrado de', args.x, 'es', args.x**2 )

Mensajes de ayuda

Con el mismo ejemplo2 agregaré un mensaje de ayuda que añade una descripción al argumento. En cada .add_argument agrego el parámetro help.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("nombre", type = str, help = 'Tu nombre')
parser.add_argument("x", type = float, help = 'Número para encontrar el cuadrado') 
args = parser.parse_args()

print('Hola,', args.nombre, '! el valor al cuadrado de', args.x, 'es', args.x**2 )

Los mensajes de ayuda, permiten recordar que valores debemos ingresar en la línes de comandos para que los argumentos tengan sentido y funcione el código. Para que aparezca la ayuda se debe escribir -h después del script , así:

kipuna@kipuna:~/Escritorio$ python3 ejemplo2.py -h

El resultado será como se muestra a continuación:

  • Usage: Muestra el nombre del script y los argumentos que puede recibir, en este ejemplo son: -h nombre x. Algunos son argumentos posicionales imprescindibles para funcionar como nombre y x; otros no como -h que es un argumento opcional.
  • positional arguments: Son argumentos que debe recibir el script para funcionar, junto se muestra una breve reseña de lo que recibe como argumento (nombre x).
  • optional arguments: Son opcionales, no son imprescindibles para funcionar como:-h que es la ayuda.

Ejemplo3 – argparse

En este ejemplo se introducen varios argumentos numéricos y se suman entre ellos. También se introduce el parámetro nargs al método add_argument()

Número de argumentos en la linea de comandos – nargs

nargs asocia un número diferente de argumentos de línea de comandos con una sola acción. Los valores permitidos en nargs son:

  • N se especificando un número entero ej: nargs=6
  • '*' ingresan multiples argumentos y se recogen en una lista
  • '+' ingresan multiples argumentos y se recogen en una lista igual que '*', pero si no ingresa ningun argumento mostrará un mensaje de error.
  • '?' ingresará un valor desde la linea de comandos si es posible

En el siguiente código especifico nargs como nargs=6, imprimo los enteros que ingresan y sumo esos valores.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('enteros', type=int, nargs=6)
args = parser.parse_args()

print(args.enteros)
print(sum(args.enteros))

Ejecutar en la terminal

kipuna@kipuna:~/Escritorio$ python3 ejemplo3.py 2 1 4 5 0 3 

El resultado es como muestra a continuación:

En el siguiente código especifico a nargs como nargs='*', puedo ingresar tantos valores como necesite. Imprimo los enteros que ingresen y sumo esos valores.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('enteros', type=int, nargs='*')
args = parser.parse_args()

print(args.enteros)
print(sum(args.enteros))

Ejecutar en la terminal

kipuna@kipuna:~/Escritorio$ python3 ejemplo3.py 7 4 9 10 2 0 1 5

En este ejemplo ingreso 8 valores, aparecerá la lista de los enteros ingresados y la suma de los mismos. Cuando no ingreso ningun valor como argumento, la lista aparece vacía.

En el siguiente código especifico a nargs como nargs='+', puedo ingresar tantos valores como necesite igual que con nargs='*'. La diferencia es que cuando no ingresa ningun valor aparece un mensaje de error. nargs='+' requiere al menos 1 valor

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('enteros', type=int, nargs='+')
args = parser.parse_args()

print(args.enteros)
print(sum(args.enteros))

Ejecutar en la terminal

kipuna@kipuna:~/Escritorio$ python3 ejemplo3.py 7 4 9 10 2 0 1 5

En el siguiente código especifico nargs comonargs='?', este recibirá un solo valor.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('entero', type=int, nargs='?')
args = parser.parse_args()

print(args.entero)
print(type(args.entero))

Ejecutar en la terminal, cuando no se ingresa un valor mostrara lo siguiente:

Ejemplo4 – argparse

En este ejemplo aplico argumentos opcionales. Los argumentos opcionales se especifican con doble guión -- o guión simple - 1.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--text")
args = parser.parse_args()
if args.text:
    print(args.text)

Ejecutar en la terminal:

kipuna@kipuna:~/Escritorio$ python3 ejemplo4.py --text Hola_Milu

En este ejemplo , si al ejecutar omito el argumento, no mostrará ningun mensaje porque se trata de un argumento opcional, así:

Ejemplo5 – argparse

Este ejemplo será similar al ejemplo2, con la diferencia que ingreso dos argumentos uno posicional nombre y un argumento opcional valor. el programa imprimirá tu nombre y encontrará el cuadrado del número que ingrese.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("nombre", type=str, help = 'Ingresa tu nombre')
parser.add_argument("--valor", type=float, help = 'Ingresa un numero para elevar al cuadrado')
args = parser.parse_args()

print('Hola,',args.nombre)
if args.valor:
    print('El valor al cuadrado de', args.valor, 'es', args.valor**2)

Ejecuto en la terminal y obtengo:

kipuna@kipuna:~/Escritorio$ python3 ejemplo5.py Milu

Omito el argumento opcional y no aparece error

Ejecutar el script con el argumento posicional y el opcional

kipuna@kipuna:~/Escritorio$ python3 ejemplo5.py Milu --valor 5

Ejemplo6 – argparse

En este ejemplo describo como funciona el parámetro action de add_argument(). Algunas acciones de action son: 'store', 'store_const', 'store_true', 'store_false', 'append', 'append_const', 'extend'

action='store'

Es la opción por defecto y almacena el valor del argumento, por ejemplo:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--nombre', action='store')
args = parser.parse_args()

print(args.nombre)

Ejecutar script

kipuna@kipuna:~/Escritorio$ python3 ejemplo5.py --nombre Milu

action='store_const'

El valor del argumento es lo que se establece en la la palabra clave const

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--nombre', action='store_const', const= "Milu")
args = parser.parse_args()

print(args.nombre)

Para ejecutar este acript se debe ingresar --nombre sin nada más adicional porque action='store_const' guarda el valor establecido en const como variable, en este ejemplo se almacenará la palabra "Milu" .

kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --nombre

Nota: El script tiene la funcion print por lo que si se omite el nombre del argumento opcional, --nombre por defecto imprimirá none

action='store_true' y action='store_false'

Son casos especiales de 'store_const' usados para almacenar los valores True y False respectivamente.

import argparse
import numpy as np

parser = argparse.ArgumentParser()
parser.add_argument('--dato1', action='store_true')
parser.add_argument('--dato2', action='store_false')

args = parser.parse_args()
print(args.dato1)
print(args.dato2)

Ejecutar script con la siguiente línea

kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --dato1 --dato2

Si omito el argumento --dato1 en la terminal, al ejecutar el script se crea automáticamente un valor predeterminado de False , y del mismo modo store_false establece de forma predeterminada True cuando el argumento de la línea de comandos no esté presente.

kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py 

Aunque no ingrese ningun argumento desde la terminal se imprimirá True o False porque en el scrip uso la funcion print para mostrar el estado de las variables, en este ejemplo muestra los valores por defecto.

action='append'

Añade a una lista cada valor ingresado como argumento

import argparse
import numpy as np

parser = argparse.ArgumentParser()
parser.add_argument('-n','--numeros', action='append', type=float)
args = parser.parse_args()

print(args.numeros)
print(type(args.numeros))
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py -n 1 -n 2 -n 3 -n 4 

action='append_const'

Almacena el valor de const en una lista, de acuerdo a los argumentos que ingresan desde la terminal.

El siguiente script almacena los valores de la densidad de varios líquidos, y desde la terminal se elige la densidad del elemento que desee.

import argparse
import numpy as np

#Densidad [g/cm3] de algunos liquidos en una lista
parser = argparse.ArgumentParser()
parser.add_argument('--agua', dest='densidades', action='append_const', const= 1)
parser.add_argument('--aceite', dest='densidades', action='append_const', const=0.9)
parser.add_argument('--gasolina', dest='densidades',action='append_const',const=0.7)
parser.add_argument('--petroleo' , dest='densidades',action='append_const',const=0.8)

args = parser.parse_args()

print(args.densidades)

Escribo cuatro elementos para conocer sus desidades.

kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --agua --aceite --gasolina --petroleo

Escribo dos elementos para conocer sus densidades

kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --agua --petroleo

action='extend'

Extiende cada valor del argumento a una lista.

import argparse
import numpy as np

parser = argparse.ArgumentParser()
parser.add_argument("--foo", action="extend", nargs="+", type=int)

args = parser.parse_args()
print(args.foo)

Ejecutar en la terminal

kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --foo 4213756 --foo 4
kipuna@kipuna:~/Escritorio$ python3 ejemplo6.py --foo 421 3 756 --foo 4

Ejemplo7- argparse

En la documentación oficial de python encuentras este ejemplo que lo guardaré como ejemplo7.py, aquí explicaré como funciona. El código es el siguiente:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

Primero revisemos la ayuda que muestra este script al momento de ejecutar.

kipuna@kipuna:~/Escritorio$ python3 ejemplo7.py -h
  • usage: Muestra la sintaxis que debe ingresar. Los comandos opcionales [-h] [--sum] y los argumentos posicionales N [N ...], aparece los valores de N porque se especifica así en el parámetro metavar.
  • Process some integers. es la leyenda que se agrega en la descripción.
  • positional arguments: N representa números enteros que pueden ingresar al programa
  • optional arguments: -h mensaje de ayuda. –sum suma los valores ingresados como N, por defecto obtiene el máximo valor de los enteros ingresados.

Ahora ejecuto el programa sin el parámetro opcional

kipuna@kipuna:~/Escritorio$ python3 ejemplo7.py 45 3 -23 4 -6 0

Y ahora ejecuto el programa con el parámetro opcional --sum

kipuna@kipuna:~/Escritorio$ python3 ejemplo7.py --sum 45 3 -23 4 -6 0

Referencias

  1. Python argparse documentación. Guión simple – guión doble. https://docs.python.org/3/library/argparse.html#required 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *